40.实现一个 Promise.all

书诚小驿2025/02/25前端面经Javascript

实现一个 Promise.all

Promise.all 是什么?我记得它是一个方法,可以接收一个 Promise 数组,返回一个新的 Promise。当所有输入的 Promise 都成功时,这个新 Promise 才会成功,结果是一个数组,按顺序对应每个输入的 Promise 的结果。如果有任何一个 Promise 失败,整个 Promise.all 就会立即拒绝,返回第一个失败的原因。

Promise 的整个生命周期,也就是 Promise 的执行流程。这包括 pending、fulfilled 和 rejected 三个状态。当一个 Promise 被创建时,它处于 pending 状态,然后根据异步操作的结果转变为 fulfilled 或 rejected。fulfilled 状态表示操作成功完成,而 rejected 则表示失败。每个 Promise 都有 then 方法,用于处理成功和失败的情况,还可以链式调用多个 then 或 catch 方法。这里可能需要解释事件循环中的微任务队列,因为 Promise 的回调属于微任务,会在当前任务执行完后立即执行,而不是等到下一个事件循环。

1. Promise.all 的作用与机制

作用:并行处理多个 Promise,当所有 Promise 成功时返回结果数组;若任意一个失败,则立即拒绝。 核心机制:

输入:接收一个可迭代对象(如数组),元素可以是 Promise 或非 Promise 值。

处理非 Promise:自动用 Promise.resolve 包装非 Promise 值。

成功条件:所有 Promise 均成功,结果按输入顺序排列。

失败条件:任一 Promise 拒绝,立即以该错误拒绝整个 Promise.all。

示例代码:

const p1 = Promise.resolve(3);
const p2 = 42; // 非 Promise,自动包装为 resolved
const p3 = new Promise((resolve) => setTimeout(resolve, 100, "foo"));

Promise.all([p1, p2, p3]).then(console.log); // 输出:[3, 42, "foo"]

错误处理:

const pErr = new Promise((_, reject) => reject("error"));
Promise.all([p1, pErr, p3]).then(console.log).catch(console.error); // 捕获 'error'
最后更新时间' 2025/3/25 07:37:15