在 ES10 中使用 Promise.allSettled() 以及如何使用它来处理异步任务

阅读时长 7 分钟读完

Promise.allSettled() 是 ECMAScript 10 中新增的一个方法,可以用来处理异步任务的结果。它可以接受一组 Promise 对象作为参数,返回的是一个新的 Promise 对象。这个新的 Promise 对象在所有传入的 Promise 对象都被 resolved 或 rejected 时才会完成,并将所有 Promise 对象的结果以数组形式返回给调用方。

下面我们将详细介绍如何使用 Promise.allSettled() 来处理异步任务,并给出一些实际的编程示例。

Promise.allSettled() 方法的语法和用法

Promise.allSettled() 方法的语法如下:

其中,iterable 参数是一个可迭代对象,例如数组或可迭代的 Map 或 Set 对象,其中每个元素都是一个 Promise 对象。Promise.allSettled() 方法将返回一个新的 Promise 对象,该对象在传入的所有 Promise 对象都已解决(即 settled,不管是 resolved 还是 rejected)时才会被 resolved。

新的 Promise 对象解析后将获得一个数组,其中每个元素表示每个传入 Promise 对象的结果。每个结果都是一个对象,其中包含以下两个属性:

  • status:表示传入 Promise 对象的状态,其值“fulfilled”表示已解析,“rejected”表示已拒绝。
  • value(如果 status 为“fulfilled”):表示已解决的 Promise 对象的值,或已拒绝的 Promise 对象的原因(如果 status 为“rejected”)。

需要注意的是,Promise.allSettled() 方法返回的新 Promise 对象在至少有一个传入 Promise 对象被 rejected 时才会被 rejected,且 rejected 的原因是一个数组,包含每个被 rejected 的 Promise 对象的原因。

如何使用 Promise.allSettled() 处理异步任务

在实际编程中,我们可以使用 Promise.allSettled() 方法来处理一组异步任务,等待所有任务完成后再进行下一步操作,或者处理异步任务的结果。

以下是一个使用 Promise.allSettled() 方法的示例:

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

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

在上面的示例中,我们创建了一个包含三个 Promise 对象的数组,每个 Promise 对象的状态如下:

  • 第 1 个 Promise 对象是 resolved 状态,其值为 1。
  • 第 2 个 Promise 对象是 rejected 状态,其原因是一个 Error 对象。
  • 第 3 个 Promise 对象是 resolved 状态,其值为 3。

我们将这个数组作为 Promise.allSettled() 方法的参数传入,然后使用 then() 方法处理 Promise 对象的结果。在 then() 方法中,我们遍历 results 数组中的每个元素,根据其状态输出其值或原因。

执行上面的代码后,输出结果如下:

可以看到,Promise.allSettled() 方法返回了一个数组,其中包含每个 Promise 对象的结果,第 1 个元素表示第 1 个 Promise 对象的结果,第 2 个元素表示第 2 个 Promise 对象的结果,以此类推。由于第 2 个 Promise 对象被 rejected,它的原因被输出为一个 Error 对象。

使用 Promise.allSettled() 方法来处理多个异步任务

有时候我们需要处理多个异步任务,等待它们全部完成后再执行下一步操作。在这种情况下,我们可以使用 Promise.allSettled() 方法来处理这个问题。

以下是一个使用 Promise.allSettled() 方法处理多个异步任务的示例:

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

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

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

在上面的示例中,我们定义了一个 fetchData() 函数,用于获取指定 URL 中的数据。这个函数返回一个 Promise 对象,可以使用其中的 then() 方法处理获取到的数据,或者使用 catch() 方法处理获取数据的出错情况。在 fetchData() 函数中,我们将获取到的数据和出错原因封装成一个对象,并在 then() 和 catch() 方法中分别返回这个对象。

现在我们有多个 URL 需要在异步任务中处理,我们将这些 URL 存储在一个数组中,在调用 Promise.allSettled() 方法时使用 map() 方法将这些 URL 转化为一个包含多个 fetchData() 函数返回的 Promise 对象的数组。然后再使用 then() 方法处理这些 Promise 对象的结果。

执行上面的代码后,输出结果如下:

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

结论

使用 Promise.allSettled() 方法可以很方便地处理多个异步任务的结果。它返回的是一个新的 Promise 对象,当所有传入的 Promise 对象都已 settled 时完成,其结果是一个数组,包含每个 Promise 对象结束的状态和结果。

在实现多个异步任务时,使用 Promise.allSettled() 方法可以更加简洁、优雅地处理 Promise 对象的结果。同时,我们也可以对 Promise 对象的 reject 处理做更加充分的考虑。

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

纠错
反馈