Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Promise.all 和 Promise.allSettled 的区别 #98

Open
vincentzyc opened this issue Apr 28, 2023 · 0 comments
Open

Promise.all 和 Promise.allSettled 的区别 #98

vincentzyc opened this issue Apr 28, 2023 · 0 comments

Comments

@vincentzyc
Copy link
Owner

vincentzyc commented Apr 28, 2023

在 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。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant