ES11(也称作 ES2020)是 JavaScript 语言最新的一个版本,其中增加了一些新的特性和语法。在这篇文章中,我们将会讨论一下其中一个新特性:Promise.allSettled 方法。这个方法有助于我们处理依赖不同的异步绑定,同时也减少了代码的复杂性。
问题的背景
目前,在处理多个异步请求时,我们通常会使用 Promise.all 方法。这个方法会返回一个 Promise 对象,只有当所有的异步请求都成功时,这个 Promise 对象才会被 resolved。如果其中有一个请求失败了,整个 Promise.all 方法就会失败。这使得我们可以像下面这样来处理异步请求的结果:
Promise.all([fetch('url1'), fetch('url2'), fetch('/url3')]) .then(responses => { // 处理 responses }) .catch(error => { // 处理 error })
但是,如果其中一个异步请求失败了,整个流程就会停止。有时候我们希望不管请求成功或失败,都能处理每一个异步请求的结果。为了达成这个目的,我们需要手动地遍历每一个请求的 Promise 对象,这样做就显得比较麻烦并且容易出错。
Promise.allSettled 方法
新加入的 Promise.allSettled 方法解决了上述问题。它与 Promise.all 方法类似,都接收一个 Promise 对象数组作为参数,但是它不会在所有的异步请求都成功后才返回一个 resolved 的 Promise 对象。相反,它会在所有请求都 “settled”(也就是 resolved 或 rejected)之后返回一个新的 Promise 对象,并且在这个 Promise 对象 resolve 时,提供一个包含每个 Promise 对象的状态值(fulfilled 或 rejected)和结果(即应该在 fulfilled 时提供的数据,或在 rejected 时提供的错误信息)的数组。
Promise.allSettled([fetch('url1'), fetch('url2'), fetch('url3')]) .then(results => { // 处理每一个 Promise 对象的状态和结果 });
如果我们使用 Promise.allSettled 方法,即使有一个异步请求失败了,也仍然可以处理所有的请求结果。
示例代码
接下来我们来看一个完整的代码示例,使用 Promise.allSettled 方法处理依赖不同的异步请求的结果:
-- -------------------- ---- ------- ----- -------- ----------------- - ----- ------- --------- ------ - ----- -------------------- ---------------------------------------------------- ------------------------------------------------------- --------------------------------------------------- --- -- ---- ------- --------- --------- ---------- -- ------------- --- ------------ - -------------------------- - -- ---------------- --- ------------ - -------------------------------- - -- ------------- --- ------------ - -------------------------- - -- ---- ------- --------- -------- ------------ -- ------------- --- ----------- - ------------------------------ - -- ---------------- --- ----------- - ------------------------------------ - -- ------------- --- ----------- - ------------------------------ - - -------- ------------------- - -- -- ----- - -------- ------------------------- - -- -- -------- - -------- ------------------- - -- -- ----- - -------- ---------------------- - -- -- ---- ----- - -------- ------------------------- - -- -- ------- ----- - -------- ---------------------- - -- -- ---- ----- -
在上述示例代码中,我们使用了 Promise.allSettled 方法来并发地获取三个不同的资源。当所有的 Promise 对象都 settled 时,我们使用 if 语句来检查每一个 Promise 对象的状态,如果是 fulfilled,我们就调用相应的处理函数,否则就调用相应的错误处理函数。 这种写法不仅可以极大地简化代码,还可以使处理不同类型的异步请求更加容易。
结论
在这篇文章中,我们简要介绍了 ES11 中新增的 Promise.allSettled 方法,并讨论了它的工作原理。我们看到了如何使用这个方法来处理依赖不同的异步绑定,同时减少手动遍历每一个请求的 Promise 对象所带来的复杂性。通过上面的示例,我们也可以看到这种写法在处理不同类型的异步请求上非常有用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6749649aa1ce0063545ad508