Promise.all 并行执行多个 Promise,全成功则按序返回结果数组,任一失败则立即以首个错误拒绝;支持非 Promise 值自动包装,空数组直接 resolve;需部分失败容错时应改用 Promise.allSettled 或手动包装。

Promise.all 是 JavaScript 中用于并行执行多个 Promise 并等待它们全部成功完成的核心方法。它接收一个 Promise 实例数组,返回一个新的 Promise:当所有输入的 Promise 都 fulfilled(成功)时,新 Promise 以包含所有结果的数组 fulfilled;只要有一个失败,就立即以第一个失败的错误 rejected。
基本用法与返回值结构
Promise.all 返回的是一个 Promise,其 resolve 值是一个数组,顺序严格对应传入数组中 Promise 的顺序,与执行完成时间无关。
例如:
const p2 = fetch('/api/posts');
const p3 = fetch('/api/comments');
Promise.all([p1, p2, p3])
.then(([userRes, postsRes, commentsRes]) => {
console.log('全部请求成功', userRes, postsRes, commentsRes);
})
.catch(err => {
console.error('其中一个失败了', err); // 第一个出错的 Promise 的 error
});
关键行为要点
- 并行执行:所有 Promise 同时启动,不是串行等待
- 短路失败:任意一个 Promise reject,Promise.all 立即 reject,其余仍在运行但结果被丢弃
- 结果保序:即使 p3 最先完成,它的结果仍放在返回数组的第三个位置
- 空数组直接 resolve:Promise.all([]) 立即返回 Promise.resolve([])
- 支持非-Promise 值:会自动用 Promise.resolve() 包装,如 Promise.all([1, Promise.resolve(2)]) → [1, 2]
处理部分失败的常见策略
如果需要“不管谁失败都等全部结束,并收集结果(含错误)”,不能直接用 Promise.all。可改用:
立即学习“Java免费学习笔记(深入)”;
- Promise.allSettled():ES2020 新增,返回每个 Promise 的 {status: 'fulfilled'|'rejected', value|reason} 对象数组
-
手动包装 + catch:把每个 Promise 改造成总是 resolve 的形式,例如:
const safe = (p) => p.then(res => ({ ok: true, data: res })).catch(err => ({ ok: false, error: err }));
Promise.all([safe(p1), safe(p2), safe(p3)]).then(results => { /* 处理混合结果 */ });
注意事项与避坑提醒
- 不要在 Promise.all 内部写 await:这会让异步操作变串行,失去并行意义
- 避免传入空或 undefined 元素:会导致 TypeError,建议提前过滤或校验
- 注意内存与并发数:同时发起大量请求可能触发浏览器限制或服务端限流,必要时配合 Promise.allLimit(需自行实现或使用库)
- fetch 默认不抛错:4xx/5xx 状态码不会触发 catch,需手动检查 response.ok


















