异步操作应依依赖关系决定串行或并行:无依赖时用Promise.all并行发起,总耗时取决于最慢请求;链式依赖必须串行;循环中避免逐次await,应先生成Promise数组再all;容错场景用allSettled。

关键在分清依赖关系:不相互依赖的异步操作,不该一个接一个等。
哪些请求能并行?看数据要不要前序结果
后一个请求如果不需要前一个返回的数据,就完全可以一起发。比如首页加载时,用户信息、最新订单、热门商品推荐三者互不影响,属于典型可并行场景。
反例是:先取用户 ID,再用这个 ID 去查帖子,再用帖子 ID 查评论——这种链式依赖必须串行。
- ✅ 可并行:fetchUser()、fetchCart()、fetchBanner()
- ❌ 必须串行:fetchUser() → fetchPosts(user.id) → fetchComments(post.id)
用 Promise.all 替掉连续 await
连续写多个 await,本质是阻塞式等待,总耗时接近各请求时间之和。改成 Promise.all 后,所有请求几乎同时发出,总耗时只取决于最慢那个。
错误写法(串行,300ms):
const a = await fetch('/a');const b = await fetch('/b');
const c = await fetch('/c');
正确写法(并行,约 100ms):
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
fetch('/a'),
fetch('/b'),
fetch('/c')
]);
注意:Promise 数组里的 fetch 在传入 Promise.all 时就已执行,不是等到 await 才发起请求。
循环里别逐次 await
for 或 for...of 中直接 await 某个异步调用,仍是串行——上一轮没结束,下一轮根本不会开始。
- 错例:for (const id of ids) { const res = await fetch(`/item/${id}`); }
- 正解:先映射出所有 Promise,再 all:const promises = ids.map(id => fetch(`/item/${id}`));
const results = await Promise.all(promises);
允许部分失败时,换用 allSettled
Promise.all 遇到任意一个 reject 就立刻中断,全部失败。如果某些接口偶尔抖动但不影响主流程(如埋点上报、非核心配置),改用 Promise.allSettled 更稳妥。
它始终返回完整结果数组,每个元素带 status 字段:
const results = await Promise.allSettled([fetch('/a'), fetch('/b')]);results.forEach(r => {
if (r.status === 'fulfilled') console.log(r.value);
else console.warn('请求失败:', r.reason);
});
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










