async/await 本身不自动并行,真正并行需同时启动多个 promise;串行因 await 阻塞导致耗时累加,promise.all 可实现真并行,而 promise.allsettled、并发池等用于错误处理与流量控制。

async/await 本身不自动并行,它只是让异步代码写得像同步一样;真正实现并行,靠的是“同时启动多个 Promise”,而不是等一个结束再启下一个。
并行 ≠ await 串行调用
很多人误以为写了 await 就是并行,其实不是。下面这段代码是串行的:
❌ 串行(耗时约 6 秒)
async function serial() {
const a = await fetchA(); // 等 3s
const b = await fetchB(); // 再等 3s
return [a, b];
}
因为 await 会阻塞后续语句,必须等前一个 Promise settle 后才执行下一行。
用 Promise.all 实现真并行
并行的关键是:把所有异步操作“一次性发起”,然后统一等待结果。Promise.all 就是为此设计的:
✅ 并行(耗时约 3 秒)
async function parallel() {
const [a, b] = await Promise.all([
fetchA(), // 立即发起
fetchB() // 立即发起
]);
return [a, b];
}
这里 fetchA() 和 fetchB() 在 Promise.all 调用时就已开始执行,不互相等待。
错误处理与部分失败场景
Promise.all 一旦有任意 Promise reject,整个就失败。若需容忍部分失败,可用以下方式:
- 用 Promise.allSettled() —— 等所有完成,返回每个 Promise 的 { status, value/reason }
- 用 try/catch 包裹单个 Promise,或提前用 .catch(() => null) 转换为成功态
- 对关键任务做重试封装,比如封装成 retry(fetchA)
进阶:动态数量的并行控制
当要并发大量请求(如 100 个 API 调用),直接 Promise.all 可能压垮服务端或浏览器。这时需要限制并发数:
- 用 并发池(concurrency pool):维护一个最多运行 n 个 Promise 的队列
- 常见库如 p-limit、p-map 提供开箱即用的限流能力
- 手写逻辑核心是:用 Promise.race 找出最先完成的任务,腾出位置给下一个
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











