async函数中多个await默认串行执行;要并发请求需用Promise.all(全成功)、Promise.allSettled(全完成)或单独.catch兜底;还需注意并发数量控制和超时处理。

async 函数里写多个 await,默认是串行执行的——一个接一个,等前一个结束才开始下一个。要真正同时发起多个独立请求,关键不是堆 await,而是让它们“并发启动、各自等待”。
用 Promise.all 并发发起所有请求
这是最常用也最直接的方式。先把所有异步操作调用出来(不加 await),得到 Promise 实例数组,再用 Promise.all 统一等待。
- 每个请求在 Promise.all 调用那一刻就已开始执行,互不等待
- 返回结果按传入顺序排列,解构赋值很直观
- 只要有一个失败,整个 Promise.all 就 reject,适合“全成功才继续”的场景
示例:
async function loadProfile() {
const [user, posts, stats] = await Promise.all([
fetch('/api/user').then(r => r.json()),
fetch('/api/posts').then(r => r.json()),
fetch('/api/stats').then(r => r.json())
]);
return { user, posts, stats };
}
立即学习“Java免费学习笔记(深入)”;
用 Promise.allSettled 容错并行
当某个请求失败不该影响其他请求结果时,Promise.allSettled 更合适。它总会等到全部完成,返回每个请求的状态对象。
- 每个元素都有 status 字段('fulfilled' 或 'rejected')
- 成功时有 value,失败时有 reason,可分别处理
- 不需要额外 try/catch 包裹整个操作
示例:
async function loadDashboard() {
const results = await Promise.allSettled([
fetch('/api/user').then(r => r.json()),
fetch('/api/notifications').then(r => r.json()),
fetch('/api/settings').then(r => r.json())
]);
return results.map(r => r.status === 'fulfilled' ? r.value : null);
}
给每个 Promise 单独兜底再合并
如果希望失败请求返回默认值(比如 null、[]),而不是中断或暴露错误状态,可以在每个 Promise 后链式 .catch。
- 错误被提前捕获并转为可控的默认值
- Promise.all 仍能正常 resolve,返回的是混合结果
- 适合“尽力而为”类逻辑,比如首页卡片数据部分缺失也不报错
示例:
async function loadHome() {
const [news, ads, tips] = await Promise.all([
fetch('/api/news').then(r => r.json()).catch(() => []),
fetch('/api/ads').then(r => r.json()).catch(() => null),
fetch('/api/tips').then(r => r.json()).catch(() => '暂无提示')
]);
return { news, ads, tips };
}
注意并发数量和超时控制
真实项目中,并非越多请求并发越好。大量同时发起可能触发限流、拖慢浏览器或压垮服务端。
- 对大批量请求,考虑用 Promise 池(如 p-limit 库)限制并发数
- 单个 fetch 建议加 timeout 封装,避免某请求长期挂起阻塞整体
- 后端接口若支持批量查询(如 /api/batch?ids=1,2,3),优先合并请求


















