Promise.all/allSettled/race 是处理多个 Promise 的三种方法,核心区别在于对成功/失败的处理逻辑不同。
- Promise.all:所有 Promise 成功时返回结果数组,顺序与输入一致;任一失败则立即拒绝。
- Promise.allSettled:所有 Promise 完成(无论成功/失败)后返回状态数组,包含每个 Promise 的结果和状态。
- Promise.race:任一 Promise 成功或失败即返回其结果,忽略其他 Promise。
1. Promise.all2. Promise.allSettled3. 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'}
共同注意事项- 输入转换:非 Promise 值需通过 Promise.resolve() 转换,避免调用 then/catch 时报错。
- 错误处理:
all 和 race 会因第一个失败而终止。
allSettled 会等待所有结果,需手动检查 status。
- 顺序保证:all 和 allSettled 通过索引维护输入顺序,而非依赖 push。
总结- 需要全部成功 → Promise.all。
- 需要所有结果(无论成败) → Promise.allSettled。
- 只需第一个结果 → Promise.race。
通过理解三者差异,可灵活应对异步并发场景。