手写手写Promise.allSettled()
Promise.allSettled()主要是为了弥补Promise.all()的不足。后者如果遇到reject会只跑出reject内容,而前者无论错误失败都可以抛出,也是一个比较高频的面试手写题了。
const promises = [
Promise.resolve("Promise 1 fulfilled"),
Promise.reject("Promise 2 rejected"),
Promise.resolve("Promise 3 fulfilled"),
Promise.reject("Promise 4 rejected"),
];
allSettled(promises)
.then((results) => console.log(results))
.catch((error) => console.log(error));
function allSettled(promises) {
return new Promise((resolve, reject) => {
const results = [];
const len = promises.length;
let resolvedCount = 0;
for (let i = 0; i < len; i++) {
promises[i]
.then((value) => {
results[i] = { status: "fulfilled", value };
})
.catch((reason) => {
results[i] = { status: "rejected", reason };
})
.finally(() => {
resolvedCount++;
if (resolvedCount === len) {
resolve(results);
}
});
}
});
}