promise.all 并行执行多个 promise 并按输入顺序返回结果数组,一有失败即整体拒绝;适用于同步等待多个 api 请求,但错误处理需谨慎,可用 allsettled 或单个 catch 降级。

Promise.all 是 JavaScript 中用于并行执行多个 Promise 并等待它们全部完成的核心方法。它接收一个 Promise 实例数组,返回一个新的 Promise:当所有输入的 Promise 都成功时,新 Promise 以包含所有结果的数组兑现(fulfilled);只要有一个失败,就立即以第一个失败的错误拒绝(rejected)。
基本用法和返回值结构
Promise.all 接收一个可迭代对象(通常是数组),其中每个元素应为 Promise 实例(或可被 Promise.resolve() 转换的值)。它不改变原始 Promise 的执行顺序,只是统一监听它们的状态:
- 结果数组的顺序严格对应输入数组的顺序,与各 Promise 完成的先后无关
- 即使某个请求响应很快,它的结果也会放在原位置,不会“插队”
- 如果传入非 Promise 值(如字符串、数字),会被自动包装为已兑现的 Promise
处理多个 API 请求的典型场景
比如同时获取用户信息、订单列表和通知数量:
const userPromise = fetch('/api/user').then(res => res.json());
const ordersPromise = fetch('/api/orders').then(res => res.json());
const notificationsPromise = fetch('/api/notifications').then(res => res.json());
Promise.all([userPromise, ordersPromise, notificationsPromise])
.then(([user, orders, notifications]) => {
console.log('用户', user);
console.log('订单', orders);
console.log('通知', notifications);
})
.catch(error => {
// 只要有一个请求失败,这里就会被捕获
console.error('某项请求出错:', error);
});
注意错误处理的局限性
Promise.all 的“全成功才成功”特性在某些场景下反而成了障碍。例如一个请求失败不应导致整个流程中断:
- 可提前用 Promise.allSettled 替代(ES2020+),它会等所有 Promise 结束,返回每个结果的状态对象
- 也可对单个 Promise 做兜底处理,例如
.catch(() => null),确保它不会拒绝 - 避免在 all 内部直接 throw 错误,否则会触发整体 reject
实用小技巧
提升代码可读性和健壮性:
- 用解构赋值接收结果,语义清晰,但需确保数组长度固定
- 给每个 Promise 加上超时控制,防止某个请求长期挂起拖垮整体(可用 AbortSignal 或封装 timeout 函数)
- 避免在数组中混用同步值和异步 Promise,保持逻辑一致性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











