Promise并发聚合核心是Promise.all()、allSettled()、race()等方法:all()要求全成功且按序返回,任一失败则整体拒绝;allSettled()始终完成并返回各任务状态;需限流时用并发池;复杂聚合在all()后用数组方法处理。

Promise 处理并发数据聚合,核心是用 Promise.all()、Promise.allSettled() 或 Promise.race() 等组合方法,配合异步请求或计算任务,统一等待多个 Promise 完成后汇总结果。
用 Promise.all() 并发请求并聚合成功数据
适合所有请求都必须成功,且需要按顺序拿到全部结果的场景。它会并发发起所有请求,任一失败则整体 reject。
- 传入一个 Promise 实例数组,返回一个新的 Promise
- 全部 fulfilled 时,新 Promise 以包含所有结果的数组 fulfilled
- 只要一个 rejected,新 Promise 立即以该错误 rejected(其余仍在运行但结果被丢弃)
示例:
const [users, posts, comments] = await Promise.all([fetch('/api/users').then(r => r.json()),
fetch('/api/posts').then(r => r.json()),
fetch('/api/comments').then(r => r.json())
]);
用 Promise.allSettled() 获取每个任务的完整状态
当部分失败可接受,且你需要知道每个请求是成功还是失败时使用。它不会短路,始终等待全部完成。
立即学习“Java免费学习笔记(深入)”;
- 返回的 Promise 总是 fulfilled,值是一个对象数组
- 每个对象含
status("fulfilled" 或 "rejected"),以及对应的value或reason - 适合做容错聚合、日志统计、批量操作反馈
示例:
const results = await Promise.allSettled([fetch('/api/user/1'),
fetch('/api/user/2'),
fetch('/api/user/invalid')
]);
const successes = results.filter(r => r.status === 'fulfilled').map(r => r.value.json());
手动控制并发数量避免资源过载
Promise.all() 默认全量并发,可能压垮服务端或浏览器连接池。需限制同时进行的请求数(如最多 3 个)。
- 可用 async/await + for 循环分批处理
- 更推荐使用工具函数(如 p-limit 库)或手写“并发池”逻辑
- 关键点:维护运行中任务队列,空闲时从待执行队列取新任务
简易并发池示意:
async function limitConcurrency(tasks, limit = 3) {const results = [];
const executing = [];
for (const task of tasks) {
const p = Promise.resolve(task()).then(res => {
executing.splice(executing.indexOf(p), 1);
return res;
});
results.push(p);
executing.push(p);
if (executing.length >= limit) await Promise.race(executing);
}
return Promise.all(results);
}
结合 reduce 或自定义聚合逻辑做动态合并
当聚合规则复杂(如去重、按字段合并、加权平均等),可在 Promise.all() 后链式处理结果。
- 避免在每个 Promise 内部做聚合,保持职责分离
- 利用 Array 方法(reduce/map/filter)对结果数组做二次加工
- 注意深拷贝或引用问题,尤其处理嵌套对象时
示例(合并多接口返回的用户列表并去重):
const allUsers = await Promise.all([getActiveUsers(), getInactiveUsers(), getPendingUsers()]);const uniqueUsers = [...new Map(allUsers.flat().map(u => [u.id, u])).values()];


















