串行 await 会累加耗时,改用 promise.all 可并发执行,总耗时接近最慢请求;需注意错误处理(可用 .catch 或 promise.allsettled)、后端限流、请求依赖及浏览器并发限制。

多个 await 并排写(比如连续 await 三个 API 调用)是串行执行,耗时累加;改用 Promise.all 可让它们并发发起,总耗时接近最慢的那个请求,性能明显提升。
识别串行 await 的典型写法
常见低效模式:
const a = await fetch('/api/a').then(r => r.json());
const b = await fetch('/api/b').then(r => r.json());
const c = await fetch('/api/c').then(r => r.json());
这段代码实际等待 a 完成后再发 b,b 完成后再发 c,总时间 ≈ a + b + c。
用 Promise.all 并发发起所有请求
把 await 拆出来,先并发启动所有 Promise,再统一 await 结果:
- 所有 fetch 调用不带 await,直接生成 Promise 数组
- 用
Promise.all([p1, p2, p3])包裹,一次等待全部完成 - 解构或按顺序获取返回值,逻辑不变
重构后:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
const [a, b, c] = await Promise.all([
fetch('/api/a').then(r => r.json()),
fetch('/api/b').then(r => r.json()),
fetch('/api/c').then(r => r.json())
]);
注意错误处理:失败即全败
Promise.all 遇到任意一个 reject 就立刻 reject,不会等其余完成。如果需要“部分失败也继续”,可用以下方式:
- 每个 Promise 包一层
.catch(() => null)或自定义兜底值 - 或改用
Promise.allSettled(返回每个 Promise 的 { status, value/reason })
例如容错写法:
const [a, b, c] = await Promise.all([
fetch('/api/a').then(r => r.json()).catch(() => ({})),
fetch('/api/b').then(r => r.json()).catch(() => ({})),
fetch('/api/c').then(r => r.json()).catch(() => ({}))
]);
适用边界:不是所有场景都适合
Promise.all 提升的是 I/O 并发,但要注意:
- 后端接口是否支持高并发?避免触发限流或雪崩
- 请求之间是否有依赖?有依赖就不能强行并发
- 浏览器对同一域名的并行连接数有限制(通常 6 个),过多请求仍会排队
若请求数量大,可考虑分组 + Promise.all 批量控制并发度。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










