推荐用 async/await 与 promise.all 结合并发执行多个异步任务,避免 await 逐个调用导致串行耗时;需注意 promise.all 全失败特性,可用 allsettled 或 safe 包装实现容错,并可通过分批或 p-limit 控制并发数。

在 JavaScript 中,async/await 与 Promise.all 结合使用,是处理多个异步任务并发执行的推荐方式——既保持代码可读性,又最大化并行效率。
为什么不用 await 逐个调用?
如果用 await 依次等待多个 Promise:
const a = await fetch('/api/a');
const b = await fetch('/api/b');
const c = await fetch('/api/c');
这会变成串行请求:b 等 a 完成,c 等 b 完成,总耗时 ≈ 三者之和。
而 Promise.all 让它们同时发起,总耗时 ≈ 最慢那个(假设网络无竞争),性能提升显著。
正确写法:先发请求,再 await 统一收结果
关键点:不要对每个 Promise 单独 await,而是先构造 Promise 数组,再用 await Promise.all([...])。
- ✅ 正确示例:
async function loadUserData() {
const [user, posts, comments] = await Promise.all([
fetch('/api/user').then(res => res.json()),
fetch('/api/posts').then(res => res.json()),
fetch('/api/comments').then(res => res.json())
]);
return { user, posts, comments };
}
- ⚠️ 注意:Promise.all 内部仍需处理错误(见下一点)
- ? 提示:可以提前定义 Promise 变量,逻辑更清晰:
async function loadDashboard() {
const userP = fetch('/api/user').then(r => r.json());
const statsP = fetch('/api/stats').then(r => r.json());
const notificationsP = fetch('/api/notify').then(r => r.json());
return await Promise.all([userP, statsP, notificationsP]);
}
错误处理:Promise.all 失败即全失败
Promise.all 遇到任意一个 Promise reject,就会立即 reject,不会等其余完成。若想“尽力而为”,有几种策略:
-
方案一:用 Promise.allSettled(推荐,现代环境可用)
它返回每个 Promise 的完整状态(fulfilled/rejected),不中断执行:
const results = await Promise.allSettled([
fetch('/api/a'),
fetch('/api/b'),
fetch('/api/c')
]);
const data = results
.filter(r => r.status === 'fulfilled')
.map(r => r.value.json());
-
方案二:手动包装成 always-fulfilled Promise
适合需兼容老环境:
function safe(p) {
return p.then(data => ({ ok: true, data }))
.catch(err => ({ ok: false, err }));
}
const [a, b, c] = await Promise.all([
safe(fetch('/api/a').then(r => r.json())),
safe(fetch('/api/b').then(r => r.json())),
safe(fetch('/api/c').then(r => r.json()))
]);
进阶技巧:控制并发数量(防请求风暴)
Promise.all 默认不限制并发数。若要同时只发 3 个请求(比如调第三方 API 有频控),可用 Promise.all + 分批执行:
async function batchFetch(urls, limit = 3) {
const chunks = [];
for (let i = 0; i fetch(u).then(r => r.json()));
results.push(...await Promise.all(promises));
}
return results;
}
或者用更成熟的库如 p-limit 简化逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











