async函数中多个await默认串行执行;要并行需提前创建Promise再用Promise.all()统一await,或用Promise.allSettled()容错,或按需单独await已发起的Promise。

在 async 函数中,多个 await 默认是串行执行的——前一个 Promise 完成后才开始下一个。要实现“并行解耦”,关键不是写多个独立的 await,而是让它们**同时发起、各自等待、互不阻塞**。
用 Promise.all() 并发启动所有异步操作
这是最常用也最推荐的方式:把所有 Promise 提前创建好(不 await),再统一 await 它们的组合结果。
- 先调用异步函数获取 Promise 对象(此时任务已开始执行)
- 把这些 Promise 放进
Promise.all([...])中 - 再 await 这个 Promise.all,一次性等待全部完成
例如:
async function fetchAll() {
const promise1 = fetch('/api/user');
const promise2 = fetch('/api/posts');
const promise3 = fetch('/api/profile');
// 三个请求同时发出,不是等一个完再发下一个
const [userRes, postsRes, profileRes] = await Promise.all([
promise1,
promise2,
promise3
]);
return {
user: await userRes.json(),
posts: await postsRes.json(),
profile: await profileRes.json()
};
}
需要单独错误处理?用 Promise.allSettled()
如果某个请求失败不该导致整个流程中断,就别用 Promise.all()(它一错全错),改用 Promise.allSettled():
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 它会等所有 Promise 都结束(fulfilled 或 rejected)
- 返回数组,每个元素是
{ status: 'fulfilled' | 'rejected', value | reason } - 后续可逐个判断状态,灵活处理成功/失败
不想等全部完成?用独立变量 + 单独 await(但仍是并行发起)
有时你希望某些结果早拿到早用,而不是卡在 Promise.all 里一起等。可以这样写:
- 先并发发起所有 Promise(
const p1 = fn(); const p2 = fn();) - 然后按需 await 其中某一个,不影响其他仍在运行
- 注意:这不是“多个独立 await 实现并行”,而是“提前发起 + 按需等待”
例如:
async function handleData() {
const userP = getUser();
const postsP = getPosts();
// 先等用户数据,用于渲染基础信息
const user = await userP;
// 此时 posts 请求已在进行中,不用等它
document.title = `欢迎 ${user.name}`;
// 稍后再等文章列表(不阻塞上面的渲染)
const posts = await postsP;
renderPosts(posts);
}
避免常见误区:不要连续写多个 await
下面这种写法是串行,不是并行:
// ❌ 错误:第二个 await 必须等第一个完全结束才开始 const user = await getUser(); const posts = await getPosts(); // 这里才发起请求 const profile = await getProfile();
它的执行顺序是:发请求 → 等响应 → 解析 → 再发下一个。耗时是总和,不是最大值。

















