ES11:使用 promise.allSettled 进行并发异步程序

阅读时长 4 分钟读完

在现代 Web 开发中,异步编程是极其重要的。Promise 是异步编程的一种解决方案,其广泛应用于前端、后端等各个领域。ES11 新增了一个 promise.allSettled 方法,可以更好地解决一些异步编程的问题。

问题

在日常开发中,对于一些需要并发处理多个异步任务的场景,我们通常会使用 promise.all 方法。例如,同时请求多个接口:

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

这段代码将会并发请求三个接口,当所有请求都成功时,会得到一个包含所有响应数据的数组;当其中有一个或多个请求失败时,会触发 catch 方法,并打印错误信息。

但是,这种方式存在一个缺陷,即如果其中一个请求失败了,整个 Promise 链就会直接进入 catch 状态,并停止所有的请求。这可能会导致一些不必要的错误或数据丢失。

解决方案

为了解决上述问题,ES11 新增了一个名为 promise.allSettled 的方法。该方法默认会等待所有 Promise 对象执行完毕(无论成功或失败),并返回一个状态均为已解决(fulfilled)的 Promise 对象,其值为包含每个 Promise 对象执行结果的数组。

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

这段代码将会并发请求三个接口,当所有请求都完成时,会得到一个包含所有结果的数组,每个结果都包含以下三个属性:

  • status:表示 Promise 对象的状态,可能的值为 "fulfilled" 或 "rejected"。
  • value:表示 Promise 对象的终值,在 Promise 对象的状态为 "fulfilled" 时存在。
  • reason:表示 Promise 对象的拒因,在 Promise 对象的状态为 "rejected" 时存在。

正因为 promise.allSettled 会等待所有 Promise 对象执行完毕,因此即使其中一个 Promise 对象被拒绝(rejected),也不会影响其他 Promise 对象的执行。同时,该方法也会将所有 Promise 对象的执行结果返回给开发者,方便我们进一步处理。

示例代码

下面来看一个实际的例子。假设我们要对一个数组中的所有数字进行平方计算,并统计其中奇数值的个数。为了模拟异步操作,我们将使用 setTimeout 方法,将计算操作设定为 1 秒钟后完成。

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

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

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

这段代码将会并发执行 5 个 Promise 对象,每个对象都代表一个数字计算。当所有计算完成后,我们可以对所有结果进行筛选、处理,并输出最终结果。

总结

在日常前端开发中,异步编程是不可避免的一个话题。ES11 中新增的 promise.allSettled 方法,可以更好地解决一些异步编程中可能出现的问题,如异步任务中的失败情况。开发者应该积极使用该方法,并充分了解其具体用法和实现原理,以提高开发效率和代码质量。

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

纠错
反馈

纠错反馈