(秒懂)Promise all/allSettled/race

(秒懂)Promise all/allSettled/race
最新回答
青山一叙

2021-02-28 03:37:32

Promise.all/allSettled/race 是处理多个 Promise 的三种方法,核心区别在于对成功/失败的处理逻辑不同。

  • Promise.all:所有 Promise 成功时返回结果数组,顺序与输入一致;任一失败则立即拒绝。
  • Promise.allSettled:所有 Promise 完成(无论成功/失败)后返回状态数组,包含每个 Promise 的结果和状态。
  • Promise.race:任一 Promise 成功或失败即返回其结果,忽略其他 Promise。
1. Promise.all
  • 核心逻辑:等待所有 Promise 成功,或任一失败。
  • 关键点

    使用 Promise.resolve() 显式转换非 Promise 输入。

    通过索引 result[i] 保证结果顺序与输入一致(而非 push)。

    任一失败时直接 reject,终止等待。

  • 示例:Promise.all([p3, p2, p1]) // 全部成功 → 返回结果数组 .then(res => console.log(res)); // [{name: 'p3'}, {name: 'p2'}, {name: 'p1'}]Promise.all([p4, p2, p3]) // p4 失败 → 立即拒绝 .catch(err => console.log(err)); // {name: 'p4'}
2. Promise.allSettled
  • 核心逻辑:等待所有 Promise 完成(无论成功/失败),返回详细状态。
  • 关键点

    结果数组包含 {status: 'success/error', value: 结果/错误}。

    使用 finally 确保所有 Promise 处理完成后才 resolve。

  • 示例:Promise.allSettled([p2, p3, p4]) // 全部完成 → 返回状态数组 .then(res => console.log(res)); // [ // {status: 'success', value: {name: 'p2'}}, // {status: 'success', value: {name: 'p3'}}, // {status: 'error', value: {name: 'p4'}} // ]
3. Promise.race
  • 核心逻辑:返回第一个敲定(成功/失败)的 Promise 结果。
  • 关键点

    不关心后续 Promise 的状态。

    适合超时控制或优先获取快速结果。

  • 示例:Promise.race([p1, p2, p3]) // p1 最快 → 返回 p1 结果 .then(res => console.log(res)); // {name: 'p1'}Promise.race([p4, p2, p3]) // p4 最快(但失败)→ 立即拒绝 .catch(err => console.log(err)); // {name: 'p4'}
共同注意事项
  1. 输入转换:非 Promise 值需通过 Promise.resolve() 转换,避免调用 then/catch 时报错。
  2. 错误处理

    all 和 race 会因第一个失败而终止。

    allSettled 会等待所有结果,需手动检查 status。

  3. 顺序保证:all 和 allSettled 通过索引维护输入顺序,而非依赖 push。
总结
  • 需要全部成功 → Promise.all。
  • 需要所有结果(无论成败) → Promise.allSettled。
  • 只需第一个结果 → Promise.race。

通过理解三者差异,可灵活应对异步并发场景。