Promise.all、Promise.race、Promise.allSettled、Promise.any 有什么区别?
请对比 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/服务