async/await 不阻塞主线程,但不当使用会导致逻辑阻塞;应并行发起无依赖异步任务、在条件分支内 await、用 promise.all 替代循环中逐个 await,并将同步操作移出 await 链。

async/await 本身不会阻塞主线程,但写法不当会导致“逻辑阻塞”——即本可并行的任务被强制串行执行,拖慢整体响应速度。关键不是去掉 await,而是让 await 等在该等的地方,不等在不该等的地方。
并行发起独立异步任务
多个请求之间没有依赖关系时,不要逐个 await,否则总耗时是各请求时间之和。应改用 Promise.all 同时发起:
- 错误写法(串行,耗时叠加):
const user = await fetchUser();
const posts = await fetchPosts(); - 正确写法(并行,耗时取最大值):
const [user, posts] = await Promise.all([fetchUser(), fetchPosts()]);
条件分支中只 await 当前路径
if/else 或三元表达式里的 await 是安全的,它只在进入的分支中执行,不会提前触发无关操作:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 正确:在分支内 await
if (role === 'admin') {
return await fetchAdminData();
} else {
return await fetchUserData(id);
} - ❌ 错误:在判断前就 await,失去条件性
const data = await fetchData(); // 先取了再说,不管 role 是啥
if (role === 'admin') { ... }
循环中避免逐个 await 非依赖操作
遍历数组发送多个独立请求时,用 Promise.all 替代 for + await,否则每个请求都得等前一个完成:
- 错误(串行发请求):
for (const item of items) {
await send(item);
} - 正确(并发发请求):
await Promise.all(items.map(item => send(item)));
同步逻辑不包裹在 await 后面
await 只用于真正需要等待的异步操作。中间的纯计算、对象处理、条件判断等同步代码,别放在 await 后面“被动等待”,应尽早执行:
- 优化前:
const res = await fetch('/api/data');
const json = await res.json();
const filtered = json.filter(x => x.active); // 这步可立刻做,不用等 - 优化后:
const res = await fetch('/api/data');
const json = await res.json();
// 同步处理立刻执行,不卡在异步链里
const filtered = json.filter(x => x.active);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










