promise.all用于并发执行多个异步任务并等待全部完成:所有成功则返回按序排列的结果数组,任一失败则立即拒绝并返回首个错误;空数组时立即返回空数组。

Promise.all 是 JavaScript 中用于并发执行多个异步任务并等待全部完成的最常用方法。它接收一个 Promise 数组,返回一个新的 Promise:当所有输入 Promise 都成功时,它以包含所有结果的数组兑现;只要有一个失败,就立即以第一个失败的错误拒绝。
基本用法和返回值结构
Promise.all 接收一个可迭代对象(通常是数组),其中每个元素应是 Promise 实例(或 thenable 对象)。它不会改变原有 Promise 的执行时机,只是统一监听它们的状态。
- 所有 Promise 成功 → 返回 fulfilled 状态,值为按原顺序排列的结果数组
- 任一 Promise 失败 → 返回 rejected 状态,原因就是第一个被 reject 的错误
- 空数组 → 立即返回 fulfilled,值为 []
常见使用场景示例
比如同时请求多个 API、读取多个文件、验证多个表单字段:
const fetchUsers = fetch('/api/users');
const fetchPosts = fetch('/api/posts');
const fetchComments = fetch('/api/comments');
Promise.all([fetchUsers, fetchPosts, fetchComments])
.then(responses => Promise.all(responses.map(r => r.json()))) // 注意:fetch 返回的是 Response 对象,需二次 .json()
.then(([users, posts, comments]) => {
console.log({ users, posts, comments });
})
.catch(err => console.error('其中一个请求失败了', err));
注意并发与执行时机
Promise.all 本身不控制“并发数量”,它只是等待已启动的 Promise。所有传入的 Promise 会在调用 Promise.all 前就**立即开始执行**(因为 Promise 构造函数是同步执行的)。
- 想限制并发数(如最多同时 3 个请求),需手动实现批处理或使用第三方库(如 p-limit)
- 若某个 Promise 被创建但未 resolve/reject(如忘记 return 或卡住),Promise.all 会一直等待
- 结果数组顺序严格对应输入数组顺序,与完成先后无关
替代方案对比:Promise.allSettled
如果希望不管成功失败都等全部结束,并拿到每个 Promise 的状态,可用 Promise.allSettled:
- 返回一个对象数组,每个对象含 status("fulfilled" 或 "rejected")和 value 或 reason
- 不会因某个失败而中断,适合需要汇总所有结果的场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











