async/await 本身不造成串行等待,真正导致性能损耗的是将本可并行的任务写成逐行 await;优化核心是让独立任务尽早并发发起,如用 promise.all 并发请求无依赖接口,提前触发 loading/埋点等副作用,混合场景下关键路径串行、其余并行,并对大批量请求限流防压垮。

async/await 本身不造成串行等待,真正导致性能损耗的是代码写法——把本可并行的任务写成一行接一行的 await。优化核心就一点:让独立任务尽早发起,而不是等前一个结束才启动下一个。
独立请求必须并发发起
多个接口之间没有数据依赖(比如用户信息、菜单配置、系统公告),就绝不能逐个 await。否则总耗时是三者相加;而并发后只取决于最慢那个。
- ❌ 错误写法(串行):
const user = await fetchUser();<br>const menu = await fetchMenu();<br>const notice = await fetchNotice();
- ✅ 正确写法(并发):
const [user, menu, notice] = await Promise.all([fetchUser(), fetchMenu(), fetchNotice()]);
提前触发非依赖操作
有些事不需要等上一步结果就能做,比如展示 loading、上报埋点、预设 UI 状态。这些完全可以“先发车,后补票”。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 把请求提前赋值为 Promise:
const userPromise = fetchUser();<br>showLoading();<br>const user = await userPromise;
- 副作用不 await:
const data = await fetchData();<br>trackPageView(); // 埋点不阻塞主流程
混合场景:关键路径串行,其余并行
当部分任务有依赖、部分没有时,不要一刀切。先 await 关键判断项(如 token 或角色),再根据结果并行发起后续分支请求。
- 例如登录后根据角色加载不同模块:
const token = await login();<br>const role = await getUserRole(token);<br>if (role === 'admin') {<br> const [logs, stats] = await Promise.all([fetchLogs(), fetchStats()]);<br>} else {<br> const dashboard = await fetchDashboard();<br>}
大批量请求要分批限流
遍历 100 个 ID 调接口,全扔 Promise.all 可能压垮浏览器或后端;每个都 await 又是纯串行。合理做法是控制并发数,比如同时最多 6 个。
- 用
p-limit类工具:const limit = pLimit(6);<br>const promises = ids.map(id => limit(() => fetch(`/api/item/${id}`)));<br>const results = await Promise.all(promises); - 高频输入(如搜索框)必须加防抖,避免瞬间堆积大量请求
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










