Promise.all怎么用
Promise.all
是 JavaScript 中用于并行处理多个 Promise 的方法,它接收一个可迭代对象(通常是 Promise 数组)作为参数,返回一个新的 Promise。其作用是等待所有传入的 Promise 都成功 resolve 后,才会 resolve 一个包含所有结果的数组;如果其中任何一个 Promise 被 reject,则会立即 reject 该错误。
基本语法
Promise.all(iterable).then(results => {// 所有 Promise 都成功时执行,results 是所有结果的数组(顺序与传入顺序一致)}).catch(error => {// 任何一个 Promise 失败时执行,error 是第一个被 reject 的错误});
使用场景
当需要同时发起多个异步请求(如接口调用),且依赖所有请求的结果才能继续后续操作时,Promise.all
非常适用。
示例说明
1. 所有 Promise 都成功的情况
// 模拟三个异步操作
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, 接口返回的数据](顺序与传入数组一致)}).catch(error => {console.error('出错了:', error);});
2. 有一个 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 => {// 不会执行,因为 promise2 已经失败}).catch(error => {console.error(error.message); // 输出:"第二个操作失败"(立即捕获,不等 promise3 完成)});
注意事项
- 顺序性:返回的结果数组顺序与传入的 Promise 数组顺序一致,与实际完成时间无关。
- 快速失败:只要有一个 Promise 被 reject,
Promise.all
会立即 reject,不会等待其他 Promise 完成。 - 非 Promise 值:如果传入的可迭代对象中包含非 Promise 值,会被直接当作
Promise.resolve(该值)
处理。 - 空数组:如果传入空数组,
Promise.all
会立即 resolve 为空数组。
扩展:类似方法
Promise.allSettled
:等待所有 Promise 完成(无论成功或失败),返回包含每个结果状态的数组(适用于需要知道所有操作结果的场景)。Promise.race
:只要有一个 Promise 完成(成功或失败),就立即返回该结果(适用于“取最快响应”的场景)。Promise.any
:等待第一个成功的 Promise,若所有都失败则返回汇总错误(适用于“只要有一个成功即可”的场景)。