相对于之前实现的Promise.all(),其实allSettled的实现方式只是需要增加一些步骤。
因为对于Promise.allSettled()来说,需要将每一个promise的状态用对象装起来,并包含每一个promise的status及value,所以需要捕获成功和失败的状态,并在finally中统计完成结果,直到全部完成。
function promiseAllSettled(promises) {
return new Promise((resolve) => {
const results = [];
let completedPromises = 0;
promises.forEach((promise, index) => {
// 确保每项都是Promise
Promise.resolve(promise)
.then((value) => {
results[index] = { status: 'fulfilled', value };
})
.catch((reason) => {
results[index] = { status: 'rejected', reason };
})
.finally(() => {
completedPromises += 1;
if (completedPromises === promises.length) {
resolve(results);
}
});
});
// 处理空数组的情况
if (promises.length === 0) {
resolve(results);
}
});
}