Promise.all用于并发执行多个Promise并等待全部完成:全成功则返回按序结果数组,一失败则立即拒绝并返回首个错误。需注意错误中断、空数组立即解析、并发限制等问题。

Promise.all 用来同时发起多个异步操作,并等待它们全部完成。只要有一个失败,就立即拒绝整个 Promise;全部成功时,返回一个按顺序排列的成功结果数组。
基本用法:传入 Promise 数组
Promise.all 接收一个由 Promise 实例组成的数组(或任何可迭代对象),返回一个新的 Promise:
- 所有 Promise 都 fulfilled → 新 Promise 变为 fulfilled,值为结果数组(顺序与输入一致)
- 任一 Promise 被 rejected → 新 Promise 立即变为 rejected,值为第一个被拒绝的错误
示例:
const p1 = fetch('/api/user');
const p2 = fetch('/api/posts');
const p3 = fetch('/api/profile');
Promise.all([p1, p2, p3])
.then(responses => {
// responses 是三个 Response 对象组成的数组
return Promise.all(responses.map(r => r.json())); // 解析 JSON
})
.then(data => console.log(data)) // [user, posts, profile]
.catch(err => console.error('其中一个请求失败:', err));
注意错误处理:失败会中断整个流程
如果某个请求出错(如网络失败、404),Promise.all 会立刻 reject,后续未完成的请求不会取消,但你拿不到它们的结果。
立即学习“Java免费学习笔记(深入)”;
- 想“忽略单个失败,继续收集其余结果”,需提前对每个 Promise 做错误兜底,比如用
.catch(() => null) - 或者改用
Promise.allSettled()(ES2020+),它不管成功失败都等全部结束,返回每个 Promise 的状态对象
常见组合:配合 async/await 更简洁
在 async 函数中,可以用 await 替代 then 链,代码更线性:
async function loadAllData() {
try {
const [userRes, postRes, profileRes] = await Promise.all([
fetch('/api/user'),
fetch('/api/posts'),
fetch('/api/profile')
]);
const [user, posts, profile] = await Promise.all([
userRes.json(),
postRes.json(),
profileRes.json()
]);
return { user, posts, profile };
} catch (err) {
console.error('加载失败', err);
}
}
实际使用小提醒
- 确保传入的是 Promise 实例,不是普通值(否则会被自动包装成 resolved Promise)
- 数组为空时,Promise.all 会立即 resolve,返回空数组
- 并发数量不受限,但浏览器对同一域名的并行请求数有限制(通常 6 个左右),大量请求可能排队
- 如需控制并发数(比如一次只发 3 个),需手动实现批处理,不能靠 Promise.all


















