Promise.all() 是 Promise 提供的一个静态方法,用于并行处理多个异步操作,并在所有操作都完成后统一获取结果。它的核心作用是高效管理多个并发的异步任务,适用于需要等待多个独立操作全部完成后再进行下一步的场景。
基本语法
Promise.all(iterable)
- 参数
iterable:一个可迭代对象(通常是数组),包含多个 Promise 实例。 - 返回值:一个新的 Promise 对象。
核心作用与行为规则
等待所有 Promise 完成
只有当传入的所有 Promise 都变为fulfilled(成功) 时,Promise.all()返回的新 Promise 才会变为fulfilled,并将所有结果按原顺序组成数组返回。示例:所有异步操作成功
const promise1 = Promise.resolve(1); const promise2 = new Promise(resolve => setTimeout(() => resolve(2), 1000)); const promise3 = fetch('https://api.example.com/data').then(res => res.json()); Promise.all([promise1, promise2, promise3]) .then(results => { console.log(results); // [1, 2, 接口返回数据](按原数组顺序) });
快速失败机制
只要传入的 Promise 中有一个变为rejected(失败),Promise.all()会立即变为rejected,并返回第一个失败的原因(忽略其他未完成的 Promise)。示例:有一个异步操作失败
const promise1 = Promise.resolve(1); const promise2 = Promise.reject(new Error("操作失败")); // 立即失败 const promise3 = new Promise(resolve => setTimeout(() => resolve(3), 1000)); Promise.all([promise1, promise2, promise3]) .then(results => { console.log(results); // 不会执行 }) .catch(error => { console.error(error.message); // 输出:"操作失败"(只捕获第一个错误) });
适用场景
- 并行加载资源:如同时请求多个接口数据,等待所有数据返回后再渲染页面。
- 批量处理任务:如同时上传多个文件,等待所有文件上传完成后提示“全部上传成功”。
- 聚合多个独立结果:如从不同数据源获取数据,合并后进行处理。
注意事项
- 结果顺序:返回的结果数组顺序与传入的 Promise 数组顺序一致,与实际完成时间无关(即使某个 Promise 先完成,也会按原顺序排列)。
- 性能:所有 Promise 是并行执行的,总耗时取决于最慢的那个操作(而非所有操作耗时之和)。
- 错误处理:需通过
catch()捕获可能的错误,否则单个 Promise 失败会导致整个Promise.all()失败。 - 非 Promise 值:如果传入的数组中包含非 Promise 值(如普通数字、字符串),会被自动包装为
Promise.resolve(值),不影响整体执行。
总结
Promise.all() 的核心价值是高效并行处理多个异步任务,并在所有任务成功后统一获取结果,或在任一任务失败时立即反馈错误。它是处理并发异步操作的重要工具,能显著提升多任务场景下的效率。