ECMAScript 2021 新特性:promise.allSettled()

阅读时长 5 分钟读完

随着工作中对 JavaScript 的依赖越来越多,我们也需要更多的异步编程技术去处理请求。ES2021 提供了一个新的方法:Promise.allSettled(),这个方法允许你同时处理多个 Promise 对象,不同于 Promise.all()Promise.allSettled() 不会在单个 Promise 对象失败时中断整个过程,而是会在所有 Promise 对象的状态都变换完毕后返回结果。这篇文章将通过讲解实例,来让你更好地了解 Promise.allSettled() 的使用方法,以及在后续的工作中,如何将其应用到你的项目中。

现状与对策

在当前的开发环境下,我们常用的异步处理方式大概有以下这些:

这虽然能够很好地处理你给出的异步请求数组,但是只要发生了一个错误,所有方法都会被中断,这导致我们无法在劳动力浪费的情况下找到已经处理结束的 Promise 对象。因此,我们需要一种新的方法,来保证所有 Promise 对象都能够被处理。

什么是Promise.allSettled()

Promise.allSettled() 方法返回一个 Promise 对象,该对象当所有给出的 Promise 都已经被解决后才会被解决。无论 Promise 对象完成成功还是失败,该方法都会一直执行,直到所有的 Promise 对象都被处理完毕。返回的结果数组中会包括处理后的每个 Promise 的结果,而它们的状态也可以在返回的值中被访问到。

Promise.allSettled()的使用方法

要使用 Promise.allSettled(),只需要将所有异步请求作为一个数组参数传递给它即可。

其中的 results 包括每一个 Promise 所返回的结果,以及它们的状态。你可以通过尝试一下左侧的代码块来理解这个方法是如何工作的。

Promise.allSettled()的结果

Promise.allSettled()的结果数组中,每个 Promise 都会包含着标准属性的: status and valuereason

  • status 表示该 Promise 结果状态的变化,可能的值为: "fulfilled" 表示可以取得该 Promise 的 value 值,"rejected" 表示该 Promise 处理失败;

  • value 或者 reason 属性包含着 Promise 对象的 resolved 或者 rejected 的理由。

例如:

将会输出:

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

在代码中使用Promise.allSettled()

我们在实际的工程中经常会调用外部的 API 或者依赖其他的模块/库。我们通常需要获取这些依赖库后,将所有的东西都一起使用,但这往往是比较耗时的事情,因为你可能需要在一段时间内等关键依赖完成。

假设你需要从两个不同的API获取数据,你可以像下面这样使用Promise.allSettled()

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

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

在该代码块中,我们请求两个API的结果,使用 Promise.allSettled() 来处理所有的数据都已经获取完毕,在结果完成时打印消息。这个例子不是简单的处理成功数据,你们也可以把它推广到其他任何你需要的情况中。

结论

Promise.allSettled() 是一个很实用的异步处理工具,它还有很多其他的使用方法,也可以和其他工具,如 Async/await 结合来实现更多实用的功能。在以后的开发过程中,当你需要处理多个异步请求时,你应该了解这一工具,因为它将帮助你节省时间并更加高效地编写代码。

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

纠错
反馈