使用 ECMAScript 2018 的 Promise.allSettled() 解决异步编程中的问题

阅读时长 6 分钟读完

异步编程是现代前端开发中的关键技能之一,但同时也容易带来各种问题,例如:多个异步操作之间的相互依赖、错误处理等等。在 ECMAScript 2018 中引入了 Promise.allSettled() 方法,它可以非常方便地解决我们在异步编程中遇到的各种问题。

Promise.allSettled() 方法

Promise.allSettled() 方法接收一个 promise 数组,返回一个新的 promise,该新 promise 在所有接收的 promise 都已经 settled(已经 resolved 或 rejected)之后 resolve。

在所有 promise 都 settled 之前,Promise.allSettled() 不会返回任何结果。当所有 promise settled 之后,Promise.allSettled() 返回一个 promise 数组,每一个 promise 都包含以下两个属性之一:status 和 value 或 reason。

  • status: "fulfilled" 表示该 promise 被 resolve 了,"rejected" 表示该 promise 被 reject 了。
  • value 或 reason:如果该 promise 被 resolve 了,value 将是 resolve 的值,如果该 promise 被 reject 了,reason 将是 reject 的原因。

下面是 Promise.allSettled() 的一个示例代码。

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

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

输出结果:

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

解决异步操作之间的依赖

在前端开发中,我们经常需要依靠一个异步操作的结果去执行另一个异步操作。Promise.all() 可以解决这个问题,但它要求所有 promise 都 resolve 才会 resolve,其中一个 promise reject 就会 reject。这可能会导致我们希望 resolve 但实际上 reject 的 promise 被 reject,使整个操作失败。

Promise.allSettled() 可以解决这个问题,它会等待所有的 promise settled,无论是 reject 还是 resolve。

例如,我们想要等待两个异步请求完成,将它们的结果合并起来使用。我们可以使用 Promise.allSettled(),如下所示。

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

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

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

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

处理错误

在异步编程中,错误处理也是一个重要的问题。我们需要确保错误被捕获,以避免程序崩溃或不可预知的行为发生。

Promise.all() 对于任何一个 promise 被 reject 都会立即 reject。这可能会导致一些被希望 resolve 的 promise 受到影响,整个操作失败。

Promise.allSettled() 不像 Promise.all() 那样,一个 promise 被 reject 不会影响其他 promise 的状态。相反,它会将错误信息作为 reason 包含在 promise 中,继续等待其他 promise settled。

例如,我们需要同时获取两个异步请求的结果。使用 Promise.allSettled(),我们可以得到所有的结果,然后针对错误进行处理。

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

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

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

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

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

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

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

结论

Promise.allSettled() 是一个非常有用的方法,它可以方便地解决异步编程中的各种问题。它不仅可以解决异步操作之间的依赖,还可以处理异步操作中出现的错误。在应用 Promise.allSettled() 时,我们可以更加自信地编写稳定、可靠的程序。

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

纠错
反馈