async-await 本身不优化阻塞时间,关键在于避免串行等待、主动并行发起异步任务;应先调用所有异步函数获取 promise,再用 promise.all 并行 await,总耗时约等于最慢任务耗时。

async-await 本身不会自动优化阻塞时间,关键在于**避免串行等待、主动并行发起异步任务**。真正减少总耗时的不是 await 本身,而是让多个异步操作“尽早开始”,而不是等前一个 await 完了再启动下一个。
并行发起任务,而非串行 await
常见误区是把多个 await 写成一行接一行,这等价于同步执行——第二个请求必须等第一个响应返回才发出。正确做法是先调用所有异步函数(得到 Promise),再统一 await:
- ❌ 串行(总耗时 ≈ t₁ + t₂ + t₃):
const a = await fetchA();
const b = await fetchB();
const c = await fetchC(); - ✅ 并行(总耗时 ≈ max(t₁, t₂, t₃)):
const [a, b, c] = await Promise.all([fetchA(), fetchB(), fetchC()]);
提前触发可独立的任务
有些任务不依赖前序结果,但逻辑上被写在后面。应把它们提到最前,哪怕暂时不用结果:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 比如页面初始化时,用户信息、配置项、菜单列表三者互不依赖,就该同时发起:
const [user, config, menu] = await Promise.all([
getUser(),
getConfig(),
getMenu()
]); - 若某个任务结果用于条件分支(如根据角色加载不同模块),可先 await 关键判断项,其余分支任务在判断后立即并行启动,不盲目等待全部。
合理使用 Promise.race 或 Promise.any(应对“最快响应”场景)
当只需要任一结果(如多源接口取最快可用数据、兜底降级),可用 race/any 提前结束等待:
- const data = await Promise.race([apiPrimary(), apiBackup()]); —— 哪个先 resolve 就用哪个
- const result = await Promise.any([fetchFromCDN(), fetchFromOrigin()]); —— 忽略个别失败,只要有一个成功即可
注意 await 的“暂停点”本质
await 只是暂停当前 async 函数执行,不阻塞事件循环。所谓“阻塞时间优化”,实质是减少**逻辑上的等待链路**,而非消除 JS 单线程特性:
- await 后面必须是 Promise;直接 await 一个普通值(如 await 42)会立即继续,无实际延迟
- 不要在循环中无脑 await(如 for 循环里逐个 await API 调用),改用 Promise.all([...].map(...)) 实现并发
- 需顺序执行时(如连续上传文件),可用 reduce 链式 await,但这是业务需要,不是性能优化手段
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










