学习链接
Promise.any
AggregateError
构造函数
AggregateError(errors[, message])
- errors:数组,它的每个成员都是一个错误对象。该参数是必须的。
- message:字符串,表示 AggregateError 抛出时的提示信息。该参数是可选的。
AggregateError
的实例对象有三个属性。
- name:错误名称,默认为“AggregateError”。
- message:错误的提示信息。
- errors:数组,每个成员都是一个错误对象。
Promise.myAny = promiseArr => {
return new Promise((resolve, reject) => {
if (!promiseArr[Symbol.iterator]) {
throw new TypeError(`${promiseArr}is not iterable`);
}
if (!Array.isArray(promiseArr)) {
promiseArr = Array.from(promiseArr);
}
const result = [];
let count = 0;
promiseArr.forEach((p, i) => {
Promise.resolve(p).then(
value => {
resolve(value);
},
reason => {
count++;
result[i] = reason;
if (count === promiseArr.length) {
reject(new AggregateError(result, 'All Promises were rejected'));
}
}
)
});
})
}
测试
iterator
相关测试案例见这里
const resolved = Promise.resolve(42);
const rejected = Promise.reject(-1);
const alsoRejected = Promise.reject(Infinity);
Promise.any([resolved, rejected, alsoRejected])
.then((result) => console.log(result)); // 42
Promise.any([rejected, alsoRejected])
.catch( reason => {
console.log(reason); // AggregateError: All promises were rejected
console.log(reason.name); // AggregateError
console.log(reason.message); // All promises were rejected
console.log(reason.errors); // [-1, Infinity]
});
Promise.myAny([resolved, rejected, alsoRejected])
.then((result) => console.log(result));
Promise.myAny([rejected, alsoRejected])
.catch( reason => {
console.log(reason);
console.log(reason.name);
console.log(reason.message);
console.log(reason.errors);
});