在前端开发中,经常需要处理异步操作的结果。以往我们可能会使用 Promise.all()
方法来处理多个异步操作,并等待所有异步操作完成后再执行下一步操作。但是 Promise.all()
方法只有在所有异步操作都成功时才返回成功的结果,但只要有一个异步操作失败,整个链就会失败。
在 ES2020 中,新增了一个 Promise.allSettled()
方法,它可以在所有异步操作完成后返回它们的结果,不论是否成功。这个新的方法让我们能够更方便地处理异步操作链,并避免因某个操作失败而导致链中断的问题。
什么是 Promise.allSettled()?
Promise.allSettled()
方法接收一个待处理的 Promise 数组,并返回一个新的 Promise 实例。当这个实例解决时,会返回一个数组,其中包含所有 Promise 的结果,无论是成功的还是失败的。
如果所有 Promise 都成功,则数组中的每个元素都是一个对象,这个对象包含两个属性:status
和 value
。其中 status
的值是字符串 "fulfilled"
,value
保存了该 Promise 的返回值。
如果有一个或多个 Promise 失败,则数组中的每个元素都是一个对象,这个对象包含两个属性:status
和 reason
。其中 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