ES9 中新增的 Promise.allSettled() 实现优雅的并发处理

阅读时长 3 分钟读完

在 Javascript 中,使用 Promise 进行异步编程已经成为了标准的做法。但在实际应用中,经常遇到需要并发处理多个 Promise 的情况,而 Promise.all() 方法只要有一个 Promise 状态变为 rejected,就会立即返回。这时候我们就需要使用 ES9 中新增的 Promise.allSettled() 方法。

Promise.allSettled() 方法

Promise.allSettled() 方法接收一个 Promise 数组作为参数,返回一个 Promise 对象,它会在所有 Promise 都完成后才会结束。与 Promise.all() 不同的是,无论 Promise 状态为 fulfilled 或 rejected,Promise.allSettled() 都会将所有 Promise 的状态收集起来,作为一个数组返回。

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

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

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

可以看到,Promise.allSettled() 方法返回的数组中,每个元素都包含一个 status 属性,用于表示 Promise 的状态。如果状态为 fulfilled,那么该元素还会有一个 value 属性,表示 Promise 的返回值;如果状态为 rejected,那么该元素还会有一个 reason 属性,表示 Promise 的失败原因。

Promise.allSettled() 的应用

使用 Promise.allSettled() 可以优雅地处理多个 Promise 的并发处理。例如,我们需要同时向三个不同的服务器请求数据,但其中任意一个服务器出现故障都会导致整个应用崩溃。这时候我们可以使用 Promise.allSettled() 来处理:

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

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

这样就可以保证即使有某一个服务器出现故障,整个应用也不会崩溃,同时我们也可以很方便地获取所有的成功响应和失败原因。

总结

ES9 中新增的 Promise.allSettled() 方法可以优雅地处理多个 Promise 的并发处理,并能够获取所有 Promise 的状态。在实际应用中,Promise.allSettled() 也是一个非常实用的工具。

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

纠错
反馈