Promise.allSettled方法是ES2020新增的特性,可以执行多个Promise对象,获取多个Promise状态。相比于Promise的all方法,可以获取成功或失败的所有状态,因为Promise的all方法遇到一个rejected就会立即停止。
let p1 = new Promise((res) => {
setTimeout(()=>{
res('P1');
}, 1000)
})
let p2 = new Promise((res,rej) => {
setTimeout(()=>{
rej('error');
}, 1000)
})
Promise.all([p1,p2]).then(res=>{
console.log(res);
}) // Uncaught (in promise) error
Promise.allSettled([p1,p2]).then(res=>{
console.log(res);
}) // [{status: "fulfilled", value: "P1"}, {status: "rejected", reason: "error"}]
// 自己实现的allSettled
function MyAllSettled(lists) {
let newArr = new Array(lists.length);
let num = 0;
return new Promise((resolve) => {
lists.forEach((item, index)=>{
item.then(res=>{
let obj = {
status: 'fulfilled',
value: res
}
newArr[index] = obj;
num++;
if(num === lists.length) {
resolve(newArr);
}
}, err=>{
let obj = {
reason: err,
status: 'rejected'
}
newArr[index] = obj;
num++;
if(num === lists.length) {
resolve(newArr);
}
})
})
})
}
MyAllSettled.allSettled([p1,p2]).then(res=>{
console.log(res);
}) // [{status: "fulfilled", value: "P1"}, {reason: "error", status: "rejected"}]