手写实现 Promise.allSettled
方法,涉及创建一个新的 Promise
对象,该对象在所有输入的 Promise
对象都完成(无论成功还是失败)时解决,并返回每个 Promise
对象的状态和结果。
实现步骤
- 接收输入:接受一个
Promise
对象的可迭代对象(通常是数组)。 - 初始化:创建一个新的
Promise
对象,用于最终的结果。 - 处理每个
Promise
:遍历输入的Promise
对象,处理每个Promise
的状态(成功或失败)。 - 收集结果:将每个
Promise
对象的状态和结果收集到一个数组中。 - 完成处理:在所有
Promise
对象都完成后,返回结果数组。
实现代码
function promiseAllSettled(promises) {
return new Promise((resolve) => {
// 结果数组
const results = [];
let completedCount = 0;
// 遍历每个 Promise
promises.forEach((promise, index) => {
// 确保 promise 是一个 Promise 对象
Promise.resolve(promise)
.then(
(value) => {
results[index] = { status: "fulfilled", value };
},
(reason) => {
results[index] = { status: "rejected", reason };
},
)
.finally(() => {
// 记录已完成的 Promise 数量
completedCount++;
// 如果所有 Promise 都完成了
if (completedCount === promises.length) {
resolve(results);
}
});
});
});
}
// 示例用法
const p1 = Promise.resolve(1);
const p2 = Promise.reject(new Error("Failed"));
const p3 = new Promise((resolve) => setTimeout(resolve, 100, 3));
promiseAllSettled([p1, p2, p3]).then((results) => {
console.log(results);
/*
[
{ status: 'fulfilled', value: 1 },
{ status: 'rejected', reason: Error('Failed') },
{ status: 'fulfilled', value: 3 }
]
*/
});
说明
-
接收和处理:
- 使用
Promise.resolve(promise)
确保每个输入都是Promise
对象,方便处理非Promise
对象。 - 在每个
Promise
成功时,将{ status: 'fulfilled', value }
记录到结果数组中。 - 在每个
Promise
失败时,将{ status: 'rejected', reason }
记录到结果数组中。
- 使用
-
最终处理:
- 使用
finally()
方法确保无论Promise
成功还是失败,最终都能够执行并检查是否所有Promise
对象都完成。 - 当所有
Promise
对象都完成时,调用resolve(results)
传递结果数组。
- 使用
这种实现方法确保了处理所有 Promise
对象,无论它们的结果如何,并在所有 Promise
完成后提供最终结果。