如何使用 ES11 中的 Promise.allSettled() 方法优化异步请求?

阅读时长 5 分钟读完

在前端开发中,经常需要进行多个异步请求的并行调用,并且需要在所有请求完成后执行某些操作。在早期的javascript中,我们可能需要手动去实现Promise.all()方法来处理这样的问题。但是在ES11中,新增了Promise.allSettled()方法来更好地优化异步请求的处理。下面,我们将详细了解Promise.allSettled()的使用及优化方法。

Promise.allSettled() 的详细介绍

Promise.allSettled() 方法接收一个可迭代对象,通常是一个Promise数组,返回一个新的Promise,这个Promise将在所有的Promise都完成后被解析。

Promise.allSettled() 方法的生成器返回的Promise在所有的Promise都完成时被解决,不考虑它们是否完成或者被拒绝。它返回解析结果,即便是被拒绝。

例如,以下的Promise.allSettled() 将会返回一个数组,数组中的每一项都是一个对象,对象的状态代表了相应Promise的状态。

上述例子中,Promise.reject() 被拒绝的Promise,Promise.resolve() 被解决的Promise。 Promise.allSettled() 的返回结果是一个对象数组,其中每一个对象都包含两个属性:状态值(status)和状态结果(value 或 reason)。

Promise.allSettled() 的优势

Promise.allSettled() 方法相较于早期的Promise.all() 方法的优势在于,即使 Promise.allSettled() 中的 Promise 不全都得以解决,该方法也会把所有 Promise 都“完成”后的结果一并返回。这使得我们可以很方便地处理 Promise 拒绝的情况,而非全部考虑 Promise 的解决。

Promise.allSettled() 的用法

在处理多个异步请求时,我们通常会使用Promise.all()方法。例如,如果我们需要在一个页面上显示多个资源,每个资源都是异步加载的,代码可能如下所示:

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

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

如果其中一个 Promise 被拒绝,Promise.all()将会直接拒绝,导致所有 Promise 都会被丢弃。 实际上,我们只想拒绝 Promise 中被拒绝的 Promise。

在这种情况下,我们可以使用 Promise.allSettled() 方法来处理 Promise 。代码如下所示:

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

总结

在ES11中,新增的Promise.allSettled()方法可以更好地优化多个异步请求的处理。与Promise.all() 不同的是,无论 Promise 是否被拒绝,该方法都将所有的 Promise 的状态一并返回,这使得我们可以很方便地处理 Promise 的拒绝情况。

在实际的开发中,我们需要根据不同的情况来灵活使用Promise.all() 或是 Promise.allSettled() 方法,以达到最优的异步请求处理效果。

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

纠错
反馈