Promise.all并发发起多个异步操作并等待全部完成:全成功则以结果数组fulfilled,任一失败则立即rejected;可用Promise.allSettled或包装错误实现容错,配合async/await和动态数组更灵活。

Promise.all 是 JavaScript 中并发执行多个 Promise 并等待它们全部完成的最常用方式。它不会“真正并行”执行(JS 是单线程),但会**同时发起所有异步操作**(如多个 fetch 请求),然后统一等待全部返回结果。
基本用法:传入 Promise 数组,返回新 Promise
Promise.all 接收一个由 Promise 实例组成的数组(或可迭代对象),返回一个新的 Promise:
- 所有 Promise 都成功时,新 Promise 以包含所有结果的数组为值 fulfilled;
- 任意一个 Promise 被 reject,新 Promise 立即以该错误为原因 rejected(短路行为)。
示例:
const p1 = fetch('/api/users');
const p2 = fetch('/api/posts');
const p3 = fetch('/api/comments');
Promise.all([p1, p2, p3])
.then(responses => {
// responses 是一个 Response 对象数组,顺序与传入一致
return Promise.all(responses.map(r => r.json())); // 继续解析 JSON
})
.then(([users, posts, comments]) => {
console.log(users, posts, comments);
})
.catch(err => {
console.error('其中一个请求失败了:', err);
});
注意:错误处理要谨慎,避免因单个失败导致整体中断
默认情况下,Promise.all 对“任一失败就拒绝”很敏感。如果希望**无论成功失败都拿到结果**,可用 Promise.allSettled 替代:
立即学习“Java免费学习笔记(深入)”;
- Promise.allSettled 返回每个 Promise 的 { status, value/reason } 对象数组;
- 适合需要汇总所有请求状态(比如批量上报、容错拉取)的场景。
若仍想用 Promise.all 但规避失败中断,可提前将 Promise 包装成“永远成功”的形式:
const safeFetch = url =>
fetch(url).then(res => res.json()).catch(err => ({ error: true, message: err.message }));
Promise.all([
safeFetch('/api/a'),
safeFetch('/api/b'),
safeFetch('/api/c')
]).then(results => {
// results 始终是数组,每个元素可能是正常数据或 { error, message }
results.forEach((res, i) => {
if (res.error) console.warn(`请求 ${i} 失败:`, res.message);
else console.log(`请求 ${i} 成功:`, res);
});
});
常见配合:与 async/await 一起写更清晰
在 async 函数中,用 await + Promise.all 更简洁直观:
async function loadDashboardData() {
try {
const [user, config, notifications] = await Promise.all([
api.getUser(),
api.getConfig(),
api.getNotifications()
]);
return { user, config, notifications };
} catch (err) {
throw new Error(`加载首页数据失败:${err.message}`);
}
}
注意:解构赋值要求右侧是数组,且顺序严格对应——第一个返回值赋给 user,第二个赋给 config,以此类推。
小技巧:动态生成 Promise 数组,支持不确定数量的请求
比如根据 ID 列表批量获取用户:
const userIds = [1, 2, 3, 4, 5];
const userPromises = userIds.map(id => fetch(`/api/user/${id}`).then(r => r.json()));
Promise.all(userPromises)
.then(users => {
console.log('查到了', users.length, '个用户');
});
这种写法灵活,适用于列表渲染、搜索补全、权限预检等场景。


















