Promise.all并发执行多个Promise,按输入顺序返回结果数组,一失败则整体拒绝;需用Promise.allSettled处理部分失败,注意传入Promise实例、捕获错误及控制并发量。

Promise.all 是 JavaScript 中并发执行多个 Promise 的标准方式,它会等待所有 Promise 都成功完成,才返回结果数组;只要有一个失败,就立即拒绝并抛出错误。
基本用法:传入 Promise 数组
Promise.all 接收一个由 Promise 实例组成的数组(或可迭代对象),返回一个新的 Promise:
const p1 = fetch('/api/users');
const p2 = fetch('/api/posts');
const p3 = fetch('/api/comments');
Promise.all([p1, p2, p3])
.then(responses => {
// responses 是按顺序排列的 Response 对象数组
return Promise.all(responses.map(r => r.json())); // 解析每个响应体
})
.then(data => {
const [users, posts, comments] = data; // 解构获取结果
console.log(users, posts, comments);
})
.catch(err => {
console.error('其中一个请求失败了:', err);
});
注意顺序和结果一一对应
Promise.all 不保证执行顺序,但**结果数组的顺序严格对应输入数组的顺序**,哪怕某个 Promise 更快完成:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 即使 p2 最先返回,data[1] 仍是 p2 的结果,不会跑到第一位
- 适合需要“全部到位、按位置取值”的场景,比如表单多字段校验、批量加载配置项
处理部分失败:用 Promise.allSettled 替代(现代推荐)
如果希望无论成功失败都拿到结果,避免一个失败就中断全部,改用 Promise.allSettled:
立即学习“Java免费学习笔记(深入)”;
Promise.allSettled([p1, p2, p3])
.then(results => {
results.forEach((result, i) => {
if (result.status === 'fulfilled') {
console.log(`第${i+1}个成功:`, result.value);
} else {
console.warn(`第${i+1}个失败:`, result.reason);
}
});
});
常见陷阱与建议
- 确保传入的是 Promise 实例,不是未调用的函数 —— 写成
[fetch(...), fetch(...)],别写成[fetch, fetch] - 错误捕获必须用
.catch()或try/catch(配合await),否则会变成 unhandled rejection - 并发数量无限制,大量请求可能触发浏览器限制或服务端限流,必要时用 分批 + 控制并发数(如 p-limit 库)

















