在 ES11 中使用 Promise.allSettled() 处理异步处理链

阅读时长 4 分钟读完

在前端开发中,经常需要处理异步操作的结果。以往我们可能会使用 Promise.all() 方法来处理多个异步操作,并等待所有异步操作完成后再执行下一步操作。但是 Promise.all() 方法只有在所有异步操作都成功时才返回成功的结果,但只要有一个异步操作失败,整个链就会失败。

在 ES2020 中,新增了一个 Promise.allSettled() 方法,它可以在所有异步操作完成后返回它们的结果,不论是否成功。这个新的方法让我们能够更方便地处理异步操作链,并避免因某个操作失败而导致链中断的问题。

什么是 Promise.allSettled()?

Promise.allSettled() 方法接收一个待处理的 Promise 数组,并返回一个新的 Promise 实例。当这个实例解决时,会返回一个数组,其中包含所有 Promise 的结果,无论是成功的还是失败的。

如果所有 Promise 都成功,则数组中的每个元素都是一个对象,这个对象包含两个属性:statusvalue。其中 status 的值是字符串 "fulfilled"value 保存了该 Promise 的返回值。

如果有一个或多个 Promise 失败,则数组中的每个元素都是一个对象,这个对象包含两个属性:statusreason。其中 status 的值为字符串 "rejected"reason 保存了该 Promise 的拒绝原因。

如何使用 Promise.allSettled()?

下面的示例演示了如何使用 Promise.allSettled() 方法处理多个异步操作并获取它们的结果:

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

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

通过这个示例,我们可以看到,当所有的 Promise 都被处理之后,Promise.allSettled() 方法返回一个包含三个元素的数组。其中第二个元素(Promise2)返回了一个拒绝原因 "foo",而其他两个 Promise 都成功地解决了。

Promise.allSettled() 的应用场景

后续操作与前序操作无关

如果一组异步操作之间不存在前后依赖关系,我们不需要等待所有操作都完成后再进行下一步操作。这种情况下,我们可以使用 Promise.allSettled() 方法来并行执行所有的操作,并在所有操作完成后计算它们的结果。

忽略并排除失败操作

有时候我们需要执行很多个异步操作,并忽略其中的一些失败操作,只执行成功的操作和其他符合条件的操作。在这种情况下,我们可以先使用 Promise.allSettled() 方法获取所有操作的结果,再使用 Array.filter() 方法对不成功的操作进行过滤。

根据异常操作决定下一步操作

有时候我们需要根据某个异常操作的结果来决定下一步的操作。例如,一个应用程序需要同步多个服务,并根据每个服务的状态来决定下一步的操作。在这种情况下,我们可以使用 Promise.allSettled() 方法来获取所有服务的状态,并根据它们的结果来决定下一步的操作。

总结

ES2020 引入的 Promise.allSettled() 方法可以方便地处理异步处理链,并避免了因为某个操作失败而使链中断的问题。当所有异步操作完成后,无论是成功还是失败,都可以使用这个新的方法返回一个包含所有操作结果的数组,便于我们进行下一步的操作。

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

纠错
反馈