学习链接
40+ 大厂常考 JS 手写题系列【摸鱼必备】(不该用 push
,见测试)
Promise.allSettled
Promise.myAllSettled = 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 resArr = [];
let count = 0;
promiseArr.forEach((element, index) => {
Promise.resolve(element).then(
valule => {
resArr[index] = {
status: 'fulfilled',
valule
}
count++;
if (count === promiseArr.length) resolve(resArr);
},
reason => {
resArr[index] = {
status: 'rejected',
reason
}
count++;
if (count === promiseArr.length) resolve(resArr);
}
);
});
})
};
测试
iterator
相关测试案例见这里
注意 setTimeout
设定的时间与输出数组的顺序。
const p1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, 'p1');
});
const p2 = new Promise((resolve, reject) => {
setTimeout(reject, 500, 'p2');
});
const p3 = new Promise((resolve, reject) => {
setTimeout(reject, 1500, 'p3');
}).catch(e => e);
Promise.myAllSettled([p1, p2, p3])
.then(res => console.log(res));
Promise.allSettled([p1, p2, p3])
.then(res => console.log(res));
// [
// {status: 'fulfilled', value: 'p1'},
// {status: 'rejected', reason: 'p2'},
// {status: 'fulfilled', value: 'p3'}
// ]