/**
* 实现一个 Promise.allSettled 方法
* @param {*} list
* @returns [ { status: 'fulfilled'| 'rejected', value(fulfilled) | reason(rejected) } ]
*/
function myPromiseAllSettled(list) {
const result = [];
let count = 0;
return new Promise((reslove, reject) => {
list.forEach((promise, index) => {
promise.then((res) => {
const succeed = {
status: 'fulfilled',
value: res
}
result[index] = succeed;
count++;
},(err)=> {
const error = {
status: 'rejected',
reason: err
}
result[index] = error;
count++;
})
.finally(() => {
if(count >= list.length) {
reslove(result)
}
})
})
})
}
// test
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 100, 'foo'));
const promises = [promise1, promise2];
myPromiseAllSettled(promises).
then((results) => results.forEach((result) => console.log(result)));