手写实现 Promise.allSettled
手写实现 Promise.allSettled 方法,涉及创建一个新的 Promise 对象,该对象在所有输入的 Promise 对象都完成(无论成功还是失败)时解决,并返回每个 Promise 对象的状态和结果。
实现步骤
- 接收输入:接受一个
Promise对象的可迭代对象(通常是数组)。 - 初始化:创建一个新的
Promise对象,用于最终的结果。 - 处理每个
Promise:遍历输入的Promise对象,处理每个Promise的状态(成功或失败)。 - 收集结果:将每个
Promise对象的状态和结果收集到一个数组中。 - 完成处理:在所有
Promise对象都完成后,返回结果数组。
实现代码
javascript
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 完成后提供最终结果。