CodeWalk

Promise.all、Promise.race、Promise.allSettled、Promise.any 有什么区别?

作者:Yahuda · 2026-05-30 12:55

请对比 Promise 的四种静态组合方法在功能、行为上的差异。

回答

Yahuda

方法触发时机返回条件失败处理
Promise.all全部完成全部 resolve → 结果数组;任一 reject → 立即 reject 该错误快速失败(fail-fast)
Promise.race首个完成首个 resolve 或 reject 的结果首个 reject 即失败
Promise.allSettled (ES2020)全部完成所有结果(含状态和值/原因)的数组,不会 reject不 reject,等待所有完成
Promise.any (ES2021)首个成功首个 resolve 的结果;全部 reject → AggregateError全部失败才 reject

示例

const p1 = Promise.reject('err');
const p2 = Promise.resolve('ok');

await Promise.all([p1, p2]);     // 立即 reject('err')
await Promise.race([p1, p2]);    // reject('err')
await Promise.allSettled([p1, p2]);
// [{status:'rejected', reason:'err'}, {status:'fulfilled', value:'ok'}]
await Promise.any([p1, p2]);     // 'ok'

使用场景

  • all:多个独立请求,缺一不可
  • race:超时控制 Promise.race([fetch(url), timeout(5000)])
  • allSettled:批量操作需知道每个结果(如上传多个文件)
  • any:访问最快响应的 CDN/服务