ES11 中的 Promise.allSettled 的优点

阅读时长 4 分钟读完

在前端开发中,异步操作是非常常见的,而 Promise 是一种解决异步操作的方式,它可以避免回调地狱带来的烦恼,并且可以实现链式调用和错误处理等功能。ES11 中新增加的 Promise.allSettled 方法可以让我们更方便地处理多个 Promise 实例的同时完成和失败的情况。

Promise.all 方法的缺陷

我们先来回顾一下 Promise.all 方法。Promise.all 方法可以将多个 Promise 实例包装成一个 Promise 实例,当所有 Promise 实例都成功时,返回一个数组,数组的元素为每个 Promise 实例的返回结果,当其中有一个 Promise 实例失败时,则返回一个失败的 Promise 实例,然后就会跳过剩余未执行的 Promise 实例。

上面的例子中,p1 和 p2 都成功了,而 p3 失败了,所以 Promise.all 返回了一个失败的 Promise 实例,并直接跳过了 p2,因为它在那个时候已经完成了。

Promise.allSettled 的优点

在实际开发中,我们往往需要关注所有 Promise 实例的状态,而不仅仅是其中一个 Promise 实例的结果。此时,Promise.all 方法就显得不够用了。在 ES11 中,新增了 Promise.allSettled 方法,它可以为每个 Promise 实例的结果和状态提供详细的信息。

Promise.allSettled 方法返回一个 Promise 实例,该 Promise 实例在所有 Promise 实例的状态都被解决时进行解决,返回一个由每个 Promise 实例生成的对象组成的数组,每个对象包含了 Promise 实例的状态和返回值。

下面是使用 Promise.allSettled 方法的例子:

控制台将会输出:

可以看到,在这个例子中,Promise.allSettled 方法输出了一个数组,其中每个对象都包含了每个 Promise 实例的状态和返回值。如果一个 Promise 实例成功了,那么它的状态将会被标记为 "fulfilled",返回值将会被存储在 value 属性中。反之亦然,如果一个 Promise 实例失败了,那么它的状态将会被标记为 "rejected",错误原因将会被存储在 reason 属性中。

指导意义

使用 Promise.allSettled 方法的优点在于,它可以更好地处理多个 Promise 实例的完成情况,特别是在我们需要关注所有 Promise 实例时,这个方法是非常有用的。我们可以通过对返回对象中的属性进行判断来分别处理每个 Promise 实例的结果。例如:

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

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

在这个例子中,我们使用 forEach 遍历了返回的数组,然后根据每个 Promise 实例的状态进行处理。这种写法可以让我们更清晰地处理每个 Promise 实例的结果,而不会因为其中一个 Promise 实例的失败导致整个链式调用断掉。

总结

ES11 中新增加的 Promise.allSettled 方法可以更好地处理多个 Promise 实例的完成情况,特别是当需要关注所有 Promise 实例时,这个方法是非常有用的。使用它可以让我们更方便地处理多个 Promise 实例的同时完成和失败的情况。在实际开发中,我们可以根据返回对象中的属性来分别处理每个 Promise 实例的结果,避免因为其中一个 Promise 实例的失败导致整个链式调用断掉。

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

纠错
反馈