ES9 新特性:新增 Promise.allSettled(),修复了 Promise.all() 的问题

阅读时长 3 分钟读完

在 ES9 中,Promise 类型迎来了新的成员:Promise.allSettled()。该方法解决了 Promise.all() 函数的一些问题,同时也带来了一些新的功能。

Promise.all() 的问题

在早期的 JavaScript 中,我们常常使用 Promise.all() 函数来等待多个异步操作的结果。这个函数接收一个 Promise 数组,如果所有的 Promise 都 fulfilled,则返回一个包含所有结果的数组;否则如果任何一个 Promise 被 rejected,它就会立即返回一个 rejected 状态的 Promise。

然而,这种行为会带来一些问题。如果我们想让 Promise.all() 返回所有 Promise 的状态,不仅仅是 fulfilled 状态的结果,而是包括 rejected 状态的原因,我们需要写一些额外的代码。

另外,如果在 Promise.all() 函数中的任何一个 Promise 被 rejected,那么它将立即返回一个 rejected 状态的 Promise。这意味着其他 Promise 的处理结果可能永远不会被处理,这会导致一些严重的问题。

Promise.allSettled() 的解决方案

为了解决 Promise.all() 的问题,ES9 引入了 Promise.allSettled() 函数。与 Promise.all() 不同,Promise.allSettled() 会等待所有 Promise 的状态被 settled (fulfilled 或 rejected),然后返回一个数组,其中包含每个 Promise 的结果(不管是 fulfilled 还是 rejected)。

以下是 Promise.allSettled() 函数的语法:

这个函数仅仅会在所有 Promise 被 settled 后返回结果。如果我们想对所有的 Promise 的完成状态进行处理(即 fulfilled 或 rejected),我们只需要遍历返回的数组即可。

以下是一个使用 Promise.allSettled() 的示例:

在这个示例中,我们创建了一个包含三个 Promise 的数组。第二个 Promise 被拒绝了,因此它的状态为 rejected。当 Promise.allSettled() 被调用时,它会等待所有 Promise 都 settled 后,返回一个 Promise 对象。在 then() 函数中,我们可以对状态为 fulfilled 和 rejected 的 Promise 的结果进行处理。

总结

在 ES9 中,Promise.allSettled() 函数解决了 Promise.all() 函数的问题。使用 Promise.allSettled() 函数可以等待所有 Promise 的状态 settled 后再返回结果,然后我们就可以对每个 Promise 的结果进行处理了。

这种方式比 Promise.all() 更加灵活和安全,而且代码更加简洁和易于理解。如果你需要等待多个异步操作完成后再进行下一步,那么不妨试试使用 Promise.allSettled() 函数吧!

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

纠错
反馈