vincentzyc / notes

个人笔记

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Promise.all 和 Promise.allSettled 的区别

vincentzyc opened this issue · comments

在 JavaScript 中,我们经常会遇到需要并行执行多个异步操作的情况。针对这种需求,ES6 提供了 Promise.all 和 Promise.allSettled 方法来方便地处理多个异步任务。虽然这两个方法的名称相似,但它们之间还是存在一些区别。

Promise.all

Promise.all 方法需要传入一个数组作为参数,数组中每个元素都是一个 Promise 对象,这些 Promise 对象同时执行,当所有 Promise 都成功时,Promise.all 返回一个成功结果数组,其中每个元素对应着传入数组中相同位置的 Promise 对象的成功结果;当其中任何一个 Promise 失败时,Promise.all 直接返回一个失败结果

下面是一个使用 Promise.all 方法的例子:

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = new Promise((resolve, reject) => setTimeout(() => resolve(3), 1000));

Promise.all([promise1, promise2, promise3])
  .then(result => console.log(result))
  .catch(error => console.error(error));

在上面的例子中,Promise.all 接收到一个包含三个 Promise 的数组作为参数,分别是 promise1、promise2 和 promise3。前两个 Promise 立即成功,而 promise3 需要等待 1 秒后才能成功。因此,Promise.all 返回的结果数组为 [1, 2, 3]。

Promise.allSettled

与 Promise.all 不同,Promise.allSettled 方法接收一个 Promise 数组作为参数,这些 Promise 都会被执行,无论是成功还是失败。当所有 Promise 都被 settled(即要么成功要么失败)时,Promise.allSettled 返回一个结果数组,其中每个元素对应着传入数组中相同位置的 Promise 对象的结果,结果形式如下:

[
  { status: 'fulfilled', value: <fulfilledValue> },
  { status: 'rejected', reason: <reason> }
  // ...
]

下面是一个使用 Promise.allSettled 方法的例子:

const promise1 = Promise.resolve(1);
const promise2 = Promise.reject(new Error('error'));
const promise3 = new Promise((resolve, reject) => setTimeout(() => resolve(3), 1000));

Promise.allSettled([promise1, promise2, promise3])
  .then(results => console.log(results))
  .catch(error => console.error(error));

在上面的例子中,虽然 Promise promise2 失败了,但 Promise.allSettled 依然返回一个结果数组,数组中第二个元素对应着 promise2 的失败原因。

区别总结

综上所述,Promise.all 和 Promise.allSettled 的区别如下:

  • Promise.all 要求所有 Promise 必须成功,否则直接返回一个失败结果;Promise.allSettled 不管 Promise 成功还是失败,都会返回一个结果数组,数组中每个元素都包含了 Promise 的状态和结果。
  • Promise.all 返回的结果数组只包含每个 Promise 成功后的结果;Promise.allSettled 返回的结果数组包含每个 Promise 的状态和结果。

总之,在使用这两种方法时,需要根据实际需求选择合适的方法。如果希望所有异步操作都成功后再进行后续操作,可以使用 Promise.all;如果希望收集所有异步操作执行的结果,不管是否成功都进行处理,可以使用 Promise.allSettled。