async/await 不提升单请求速度,关键在于合理安排并行与串行:独立请求用 promise.all 并发,依赖请求链式 await,大批量请求需分批限流,非关键操作应 fire-and-forget。

async/await 本身不加快单个请求速度,但能帮你把并行和串行逻辑安排得更合理——关键不是“怎么写 await”,而是“什么时候发起请求”和“哪些必须等、哪些可以一起发”。
并行独立请求:别一个一个等,要一起发
多个接口之间没有数据依赖(比如拉用户信息、订单列表、系统配置),就绝不能逐个 await。否则耗时是相加的,而并发后只看最慢那个。
- ✅ 正确做法:先创建所有 Promise,再用 Promise.all 统一等待
const [user, orders, config] = await Promise.all([fetchUser(), fetchOrders(), fetchConfig()]); - ⚠️ 注意失败行为:Promise.all 遇到任一拒绝就会整体失败。若想“尽力而为”,改用 Promise.allSettled,它总会完成,返回每个请求的状态和结果
- ? 小技巧:请求提前发起,不卡在 await 后面
const userPromise = fetchUser();
showLoading();
const user = await userPromise;
串行依赖请求:有先后关系,才逐个 await
后续操作明确需要前一步结果时(如登录 → 拿 token → 查权限),链式 await 不仅合理,还让代码更清晰、调试更直观。
- ✅ 自然写法:
const token = await login();
const user = await fetchUser(token);
const perms = await fetchPerms(user.id); - ? 中间可插逻辑:比如校验 token 是否过期、加重试、打日志,都不用额外封装
- ⚠️ 别为了“看起来像同步”而强行串行——如果某步其实不依赖上一步(比如上报埋点、更新 UI 状态),就把它挪到 await 前或后面,别塞进链里
大批量请求:分批 + 限流,别一把梭
遍历 100 个 ID 调接口,如果每个都 await,就是 100 次串行;如果全扔 Promise.all,又可能压垮浏览器或后端。
- ✅ 推荐方案:分批 + 并发控制
用 p-limit 或类似工具限制同时最多 5–6 个请求,每批内部用 Promise.all,并行执行 - ? 示例逻辑:
const limit = pLimit(6);
const promises = ids.map(id => limit(() => fetch(`/api/item/${id}`)));
const results = await Promise.all(promises); - ⚠️ 高频场景(如搜索框输入)务必加防抖,避免瞬间发几十个请求
副作用与非关键操作:别让它们拖慢主流程
有些事不需要等,也不影响核心流程,比如缓存写入、日志上报、埋点触发。
- ✅ 分离处理:
await fetchData();
trackPageView(); // 不 await,不 catch - ✅ fire-and-forget:
saveToCache(data); // 直接调用,不 await,也不包 try/catch - ⚠️ 避免混写:
❌ await fetch(...).then(res => res.json()).then(data => render(data))
✅ 先 await 拿响应,再用同步代码处理转换和渲染
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











