await本身不实现并行,真正并行需先发起所有异步操作再统一await;串行await导致总耗时≈A+B+C,而Promise.all可使总耗时≈max(A,B,C);Promise.allSettled适用于容忍部分失败的场景;p-limit可控制并发数量防压垮服务。

await 本身不决定并行,它只负责暂停当前 async 函数等待一个 Promise 完成。真正实现并行的关键,是“先发起所有异步操作、再统一 await”,而不是逐个 await。
并行 ≠ 连续 await
连续写多个 await(如 await api.getA(); await api.getB(); await api.getC();)本质上是串行:前一个没结束,后一个根本不会启动。这会拉长总耗时,尤其在网络请求中明显。
- 错误写法:每个 await 都阻塞下一项发起 → 总耗时 ≈ A + B + C
- 正确思路:让 A、B、C 同时发出 → 总耗时 ≈ max(A, B, C)
用 Promise.all 实现可靠并行
最常用也最推荐的方式:把所有异步调用提前执行(不加 await),收集 Promise,再用 Promise.all 一次性等待全部完成。
OpenJDK 24 Windows x64 官方参考实现(24+36),适合 Windows 环境进行 Java 开发、编译、运行和版本兼容性验证。
- 示例:const [user, posts, profile] = await Promise.all([fetch('/u').then(r => r.json()), fetch('/p').then(r => r.json()), fetch('/pf').then(r => r.json())]);
- 优点:简洁、标准、并发发起、结果按顺序返回
- 注意:任一失败,整个 Promise.all 就 reject;若需容忍部分失败,改用 Promise.allSettled
处理失败更灵活的并行方案
当某些任务失败不影响整体流程时,Promise.allSettled 更合适。它总会完成,并返回每个 Promise 的状态和结果。
立即学习“Java免费学习笔记(深入)”;
- 返回值是对象数组,每项含 status: 'fulfilled' | 'rejected' 字段
- 可过滤出成功结果:results.filter(r => r.status === 'fulfilled').map(r => r.value)
- 适合批量上报、状态同步等“尽力而为”场景
控制并发数量,避免压垮服务
100 个请求一起发出去,可能触发限流或超时。实际项目中常需限制同时进行的请求数量。
- JS 推荐使用 p-limit 库:const limit = pLimit(3); const promises = urls.map(u => limit(() => fetch(u))); await Promise.all(promises);
- 逻辑本质:把并发数从“全开”降到可控值,既提速又稳住后端
- 类似需求在 Node.js 或爬虫类脚本中尤为关键

















