处理多个 Promise 应优先使用组合方法:Promise.all(全成功才返回,任一失败即拒)、Promise.allSettled(全执行完并返回状态)、Promise.race(首个settled即返回)、Promise.any(首个fulfilled即返回,全失败才拒),避免手动链式then或串行await。

多个 Promise 的结果需要统一处理时,核心是用 Promise.all()、Promise.allSettled()、Promise.race() 或 Promise.any() 这类组合方法,而不是手动写 then 链或嵌套 await。
Promise.all:全部成功才返回结果
适用于所有请求都必须成功才能继续的场景,比如同时拉取用户信息、权限列表和配置项,缺一不可。
- 只要有一个 Promise 被 reject,整个 all 就立即 rejected,其余仍在执行但结果被丢弃
- 返回值是按输入顺序排列的数组,对应每个 Promise 的 fulfilled 值
- 注意:传入空数组会立刻 resolve([])
示例:
const [user, perms, config] = await Promise.all([fetchUser(), fetchPerms(), fetchConfig()]);Promise.allSettled:不管成败都等所有结束
适合需要汇总所有请求状态的场景,比如批量提交表单、健康检查、日志上报——失败也要记录结果。
立即学习“Java免费学习笔记(深入)”;
- 返回一个对象数组,每个对象含 status("fulfilled" 或 "rejected")和 value 或 reason
- 不会因为某个失败而中断,所有 Promise 都会执行完
- ES2020+ 支持,旧环境需 polyfill
示例:
const results = await Promise.allSettled([uploadA(), uploadB(), uploadC()]);const successes = results.filter(r => r.status === 'fulfilled').map(r => r.value);
Promise.race 和 Promise.any:关注“最快响应”
当只需要第一个可用结果时使用。区别在于:race 对 reject 敏感,any 只有全部 reject 才失败。
- Promise.race:谁先 settle(无论 fulfill/reject),就用谁的结果;常用于超时控制
- Promise.any:首个 fulfilled 即 resolve;全部 rejected 才 reject(抛出 AggregateError)
- 两者都不等待其余 Promise 完成
示例(带超时):
const timeout = () => new Promise((_, reject) => setTimeout(() => reject('timeout'), 5000));try {
const data = await Promise.race([fetchData(), timeout()]);
} catch (e) { /* 处理超时或网络错误 */ }
实际合并结果的常见模式
单纯等结果不是终点,往往还要结构化、去重、过滤或错误分类。
- 用解构 + 别名避免下标访问:Promise.all([a(), b()]).then(([resA, resB]) => {...})
- 结合 Object.fromEntries 或 reduce 把数组转为键值对,方便后续查找
- 对 allSettled 结果做分组:results.reduce((acc, r) => { acc[r.status].push(r); return acc; }, {fulfilled:[], rejected:[]})
- 避免在循环里直接 await 多个 Promise(会串行),应先创建 Promise 数组再统一处理


















