Promise.allSettled 和 Promise.all 的区别及使用场景

阅读时长 4 分钟读完

JavaScript 中的 Promise 是一种很有用的异步编程模式,它可以让我们更方便地处理异步操作。在实际开发中,经常会用到 Promise.all 和 Promise.allSettled 两种方法,它们的区别以及使用场景是什么呢?

1. Promise.all

Promise.all 方法接受一个可迭代对象(比如一个数组),返回一个新的 Promise 对象。当所有的 Promise 对象都变为 resolve 状态时,Promise.all 的返回值将会是一个包含所有 Promise 对象返回值的数组。如果其中任意一个 Promise 对象变为 reject 状态,那么 Promise.all 的返回值将会是最先变为 reject 状态的 Promise 对象的返回值。

下面是一个示例代码:

-- -------------------- ---- -------
----- -------- - -
  -------------------
  -------------------
  ------------------
--

---------------------
  --------------- -- -
    --------------------- -- --- -- --
  --
  -------------- -- -
    ---------------------
  ---

在上面的代码中,Promise.all 接受了一个包含 3 个 Promise 对象的数组,由于所有的 Promise 对象都是 resolve 状态,因此最终的结果将会是一个包含每个 Promise 对象的返回值的数组。

2. Promise.allSettled

Promise.allSettled 方法也接受一个可迭代对象,返回一个新的 Promise 对象。与 Promise.all 不同的是,无论 Promise 对象最终状态是 resolve 还是 reject,Promise.allSettled 的返回值将会是一个包含所有 Promise 对象的状态和返回值的数组。

下面是一个示例代码:

-- -------------------- ---- -------
----- -------- - -
  -------------------
  --------------------- ----------
  ------------------
--

----------------------------
  --------------- -- -
    ---------------------
    --
      --
        ------- ------------
        ------ -
      --
      -
        ------- -----------
        ------- ------ --------
      --
      -
        ------- ------------
        ------ -
      --
    --
  --
  -------------- -- -
    ---------------------
  ---

在上面的代码中,Promise.allSettled 接受了一个包含 3 个 Promise 对象的数组,其中有一个是 reject 状态的 Promise 对象。最终的结果是一个包含每个 Promise 对象的状态和返回值的数组。

3. 使用场景

  • Promise.all 用于需要同时执行多个任务,并且这些任务之间没有依赖关系的情况。只有当所有的任务完成后,代码才会继续执行。

  • Promise.allSettled 用于需要同时执行多个任务,不关心它们是否成功,并想获取所有任务的状态和结果的情况。因为 Promise.allSettled 不会因为某个 Promise 对象的状态变为 reject 而停止执行其他的 Promise 对象。

4. 总结

Promise.all 和 Promise.allSettled 都是 Promise 的组合方法,在处理多个异步操作时非常有用。 Promise.all 用于需要同时执行多个任务,只有当所有的任务完成后,代码才会继续执行。而 Promise.allSettled 则用于需要同时执行多个任务,不关心它们是否成功,并想获取所有任务的状态和结果的情况。具体使用哪个方法要视需求而定。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cdbf041519ea946c18df39

纠错
反馈