promise.all并发启动多个promise并等待全部完成,全成功则按序返回结果数组,一失败则立即拒绝;可用promise.allsettled处理部分失败,需手动限流防请求风暴。

Promise.all 是 JavaScript 中用于并发执行多个 Promise 并等待它们全部完成的核心方法。它不会“真正并行”执行任务(JS 是单线程),但会同时启动所有异步操作(如 API 请求、定时器、文件读取等),然后统一等待结果。
Promise.all 的基本用法
它接收一个 Promise 实例数组,返回一个新的 Promise:
- 如果所有 Promise 都 fulfilled,新 Promise 以包含所有结果的数组 fulfilled(顺序与输入数组一致)
- 只要有一个 Promise rejected,新 Promise 立即 rejected,并返回第一个失败的原因(短路行为)
示例:
const p1 = fetch('/api/user');
const p2 = fetch('/api/posts');
const p3 = new Promise(resolve => setTimeout(() => resolve('done'), 100));
Promise.all([p1, p2, p3])
.then(([userRes, postsRes, msg]) => {
console.log(userRes, postsRes, msg);
})
.catch(err => {
console.error('其中一个请求失败了:', err);
});
处理部分失败的场景(避免短路)
若希望无论个别 Promise 是否失败都拿到全部结果(成功或错误),可用 Promise.allSettled:
- 它等待所有 Promise 进入 settled 状态(fulfilled 或 rejected)
- 返回数组,每个元素是
{ status: 'fulfilled' | 'rejected', value | reason }
限制并发数量(避免请求风暴)
Promise.all 会一次性发起所有请求,可能压垮后端或触发限流。需要控制并发数时,不能直接用 Promise.all,而应手动分批或使用工具函数:
- 把任务数组切分成每组 N 个,逐批调用 Promise.all
- 用 async/await + for 循环配合队列,或借助第三方库如 p-limit
- 简单场景下可封装一个
promiseAllWithLimit函数
常见陷阱提醒
- 传入空数组时,Promise.all 立即返回 fulfilled 的空数组 —— 这是合法且常用的做法(比如动态过滤后的请求列表)
- 传入非 Promise 值(如字符串、数字)会被自动包装成 resolved Promise,不影响执行
- 注意数组顺序:结果数组索引严格对应输入数组索引,和实际完成时间无关
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











