Promise.allSettled实现原理
Promise.myAllSettled = function (arr) {
return new Promise((resolve, reject) => {
//传入必须是一个数组,否则报错
if (!Array.isArray(arr)) {
throw TypeError('传入的必须是一个数组');
}
//把最终输出的结果用一个数组保存起来
let res = [];
let count = 0;
for (let i = 0; i < arr.length; i++) {
//用Promise.resolve是为了保证数组arr中每个元素经过其输出后都是一个Promise实例,不清楚promise.resolve可以自行百度
Promise.resolve(arr[i]).then((data) => {
count++;
res[i] = {
status: 'fulfilled',
data
};
if (count == arr.length) {
resolve(res);
}
}, (reason) => {
count++;
res[i] = {
status: 'rejected',
reason
};
if (count == arr.length) {
reject(res);
}
})
}
})
}
//验证一下
const p2 = new Promise((resolve, reject) => {
setTimeout(reject(7), 3000 )
})
const p3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(8);
}, 2000);
})
const p4 = new Promise((resolve, reject) => {
setTimeout(() => {
reject(9);
}, 1000);
})
Promise.myAllSettled([p2, p3, p4]).then(data => {
console.log(data);
});
因为Promise.all在执行的过程中,如果其中只要有一个Promise实例是rejected 状态,那么整个Promise结果将会输出 reject 的结果,而此时状态为resolved 的实例会继续执行,只是不会显示最终在结果中 Promise.allSettled 的功能是不管你输入的 Promise 实例数组中是reject还是 resolve ,都会给出执行结果