promise.all 配合 async/await 可高效并发执行多个 promise,全成功才 resolve 并按序返回结果,任一失败则立即 reject;需避免串行 await、注意并发限制,容错场景应使用 promise.allsettled。

Promise.all 配合 async/await 是 JavaScript 中处理多个并发请求的常用且高效方式,能显著提升接口响应速度,同时保持代码可读性。
Promise.all 的核心作用
Promise.all 接收一个 Promise 数组,返回一个新的 Promise。它会在所有子 Promise 都成功时才 resolve,任意一个失败则立即 reject(短路行为)。这意味着它适合“全成功才继续”的场景,比如批量获取用户信息、并行加载资源等。
- 返回值是按输入顺序排列的成功结果数组,与请求发起顺序一致,不依赖完成先后
- 一旦某个请求出错(如 404、网络中断),整个 Promise.all 会立刻 rejected,不会等待其余请求结束
- 若需“不管成败都等待全部结束”,应改用 Promise.allSettled
async/await + Promise.all 的标准写法
将 await 作用于 Promise.all,能让异步逻辑像同步代码一样直观表达:
async function fetchUserData() {
try {
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 };
} catch (error) {
console.error('请求失败:', error);
throw error;
}
}
注意:每个 fetch 后必须链式调用 .then(res => res.json()) 或 await res.json(),否则 Promise.all 等待的是 Response 对象而非解析后的数据。
避免常见陷阱
实际使用中容易忽略几个关键点:
-
不要在数组里直接 await 每个请求:写成
await fetch(...)再传入 Promise.all,会导致串行执行,失去并发意义 - 错误处理要集中捕获:Promise.all 的 reject 只触发一次,所以用一个 try/catch 包裹即可,无需为每个请求单独加 try/catch
- 注意浏览器并发限制:同一域名下 Chrome 默认最多 6 个并发连接,过多请求会被排队,实际并发数可能低于预期
-
慎用箭头函数简写:例如
Promise.all(urls.map(u => fetch(u)))返回的是 Response 数组,不是 JSON 数据,后续仍需处理
需要容错时用 Promise.allSettled
当部分请求失败不影响整体流程(例如上报多个埋点、批量上传文件),可用 Promise.allSettled 替代:
const results = await Promise.allSettled([
fetch('/api/log1'),
fetch('/api/log2'),
fetch('/api/log3')
]);
results.forEach((result, index) => {
if (result.status === 'fulfilled') {
console.log(`第 ${index + 1} 个请求成功`);
} else {
console.warn(`第 ${index + 1} 个请求失败:`, result.reason);
}
});
它始终 resolve,返回每个 Promise 的状态对象({ status: 'fulfilled' | 'rejected', value | reason }),适合“尽力而为”类需求。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











