ES10 中的 Promise.allSettled() 解决 Promise.all() 的问题

阅读时长 5 分钟读完

在前端开发中,经常会用到 Promise 这个异步编程的工具。Promise.all() 是一个非常常见的用法,它可以把多个 Promise 实例包装成一个新的 Promise 实例,当所有的 Promise 实例都成功时,返回的新 Promise 实例才会成功;当其中任意一个 Promise 实例失败时,返回的新 Promise 实例就会失败。然而,Promise.all() 存在一个问题,就是只要有一个 Promise 实例失败,就会立即终止,后面的 Promise 实例就不会再执行了。这在某些场景下是不合适的,比如需要等待所有 Promise 实例都执行完毕后再进行下一步操作的情况。ES10 中新增的 Promise.allSettled() 方法就是为了解决这个问题的。

Promise.allSettled() 的用法

Promise.allSettled() 的用法和 Promise.all() 类似,也是把多个 Promise 实例包装成一个新的 Promise 实例,并返回一个数组,数组中的每个成员都是一个对象,表示对应的 Promise 实例的执行结果。这个对象有两个属性:status 和 value。status 是字符串,表示 Promise 实例的状态,可能为 "fulfilled"(表示成功)或 "rejected"(表示失败);value 是 Promise 实例返回的结果,如果 Promise 实例成功,它就是 Promise 实例的返回值,如果 Promise 实例失败,它就是 Promise 实例抛出的错误对象。

下面是 Promise.allSettled() 的示例代码:

输出结果:

可以看到,Promise.allSettled() 返回了一个数组,数组中的每个成员都是一个对象,表示对应的 Promise 实例的执行结果。其中第一个 Promise 实例成功,返回了值 1;第二个 Promise 实例失败,抛出了一个错误对象;第三个 Promise 实例成功,返回了值 3。

Promise.allSettled() 的指导意义

Promise.allSettled() 的出现,解决了 Promise.all() 的一个痛点,让开发者能够更加灵活地处理多个 Promise 实例的执行结果。比如,在某些场景下,我们需要等待多个异步操作全部完成后再进行下一步操作,而这些异步操作可能并不是全部成功的,有些可能会失败。这时候,Promise.allSettled() 就能派上用场了。我们可以通过遍历 Promise.allSettled() 返回的数组,判断每个异步操作的状态,根据实际情况进行下一步操作。

下面是一个示例代码,演示了如何使用 Promise.allSettled() 处理多个异步操作的情况:

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

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

----------------------------
  ------------- -- -
    ------------------------ -- -- -
      -- -------------- --- ------------ -
        -------------------- --- - -- ------------ --------------
      - ---- -
        -------------------- --- - -- --------- ---------------
      -
    ---
  --
  ------------ -- -
    ---------------------- ---- -------- -------
  ---
展开代码

这段代码中,我们首先定义了一个数组 urls,其中包含了三个 API 地址。然后,我们使用 Array.map() 方法把这三个地址转换成三个 Promise 实例,放到一个数组 requests 中。接下来,我们使用 Promise.allSettled() 方法,等待 requests 中的所有 Promise 实例执行完毕后返回一个数组。最后,我们遍历这个数组,根据每个 Promise 实例的状态,输出相应的信息。

结论

ES10 中新增的 Promise.allSettled() 方法,解决了 Promise.all() 在处理多个 Promise 实例时只要有一个失败就会立即终止的问题,让开发者能够更加灵活地处理多个异步操作的结果。在实际开发中,我们可以根据具体场景,选择使用 Promise.all() 或 Promise.allSettled(),以达到最佳的效果。

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

纠错
反馈

纠错反馈