promise.all 在全部 promise 成功时返回按序结果数组,任一失败则立即 reject;空数组直接 resolve 空数组;需配合 safe 包装或改用 promise.allsettled 实现容错。

Promise.all 是处理多个并发异步请求最常用的方法,它会同时发起所有请求,并在**全部成功完成时返回结果数组**;只要有一个失败,就立即拒绝(reject),不再等待其余请求。
核心行为:全成功才 resolve,一失败就 reject
它不等失败的 Promise“重试”或“忽略”,而是直接中断整个集合的等待过程。比如你并发请求 5 个用户数据,其中第 3 个接口返回 404,那么 Promise.all 就立刻抛错,后续两个请求即使还在进行中,结果也不会被收集。
- 返回值是按输入顺序排列的 Promise 结果数组,和执行完成顺序无关
- 输入必须是 Promise 实例数组(或 thenable 对象),普通值会被自动包装成已解决的 Promise
- 如果传入空数组,Promise.all 会立即 resolve 一个空数组
常见用法示例
假设你要同时获取用户信息、订单列表和通知数量:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const userPromise = fetch('/api/user').then(r => r.json());
const ordersPromise = fetch('/api/orders').then(r => r.json());
const notificationsPromise = fetch('/api/notifications').then(r => r.json());
Promise.all([userPromise, ordersPromise, notificationsPromise])
.then(([user, orders, notifications]) => {
console.log('全部加载成功', { user, orders, notifications });
})
.catch(err => {
console.error('其中一个请求失败了', err);
});
如何“容错”:让失败不影响整体?
默认 Promise.all 不支持跳过失败项。若希望不管单个请求成败都拿到结果(类似“尽力而为”),可用以下技巧包装每个 Promise:
- 用
.then(res => ({ success: true, data: res })).catch(err => ({ success: false, error: err }))统一转为对象 - 或封装成辅助函数:
const safe = p => p.then(res => [null, res]).catch(err => [err, null]) - 再用 Promise.all 处理后,遍历结果分别判断 success 字段
注意别和 Promise.allSettled 混用
Promise.allSettled 是 ES2020 新增方法,它会等所有 Promise 都“结束”(无论 fulfilled 还是 rejected),然后返回每个结果的状态对象。如果你明确需要知道每个请求的成败细节,且不想被单点失败中断,优先选 allSettled。
不复杂但容易忽略:all 是“全通才走”,allSettled 是“全交卷才阅卷”。选哪个,取决于你的错误容忍策略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










