Promise.all 只有当所有 Promise 都成功时才返回结果数组,任一失败则立即 reject;适用于所有任务必须成功的场景,如多字段校验、权限检查等。

Promise.all 是 JavaScript 中处理多个并发异步任务的标准方式,它接收一个 Promise 数组,**只有当所有 Promise 都成功(fulfilled)时,才返回一个包含全部结果的数组;只要有一个失败(rejected),就立即 reject 整个 Promise.all。**
基本用法:传入 Promise 数组
确保你传给 Promise.all 的每个元素都是 Promise(或 thenable)。常见写法:
- 直接传入由
fetch、axios.get、new Promise等返回的 Promise 实例 - 可以用
map快速将一组参数转为 Promise 数组
示例:
const urls = ['https://api.example.com/user', 'https://api.example.com/posts', 'https://api.example.com/profile'];
Promise.all(
urls.map(url => fetch(url).then(res => res.json()))
).then(results => {
console.log('全部请求成功:', results); // [user, posts, profile]
}).catch(err => {
console.error('其中一个失败了:', err); // 第一个被 reject 的错误
});
注意:Promise.all 不会“等待失败” —— 一错即停
它不是“等所有都结束再汇总”,而是“任一失败立刻中断”。所以如果你需要不管成败都拿到结果(比如统计成功率),应改用 Promise.allSettled。
-
Promise.all:全成功才 resolve;任意 reject → 立即 reject -
Promise.allSettled:总会 resolve,返回每个 Promise 的 {status, value/reason}
实用技巧:避免常见陷阱
-
别传非 Promise 值:如
Promise.all([1, Promise.resolve(2)])会把1自动包装成Promise.resolve(1),虽能运行但易混淆,建议统一显式构造 -
错误处理要明确:
catch捕获的是第一个失败 Promise 的 error,无法知道是第几个失败 —— 如需定位,可提前在每个 Promise 内部catch并包装错误信息 -
控制并发数量(防压垮服务):如果数组很大(如 100 个请求),直接
Promise.all可能触发浏览器/服务端限制。此时要用“分批执行”或库如p-limit
小结:适用场景与替代选择
当你明确要求所有任务必须成功,缺一不可(例如:表单提交前校验多个字段 + 获取 token + 检查权限),Promise.all 就是最简洁可靠的方案。否则,根据需求考虑 Promise.allSettled、Promise.race 或手动控制流程。


















