随着工作中对 JavaScript 的依赖越来越多,我们也需要更多的异步编程技术去处理请求。ES2021 提供了一个新的方法:Promise.allSettled()
,这个方法允许你同时处理多个 Promise 对象,不同于 Promise.all()
, Promise.allSettled()
不会在单个 Promise 对象失败时中断整个过程,而是会在所有 Promise 对象的状态都变换完毕后返回结果。这篇文章将通过讲解实例,来让你更好地了解 Promise.allSettled()
的使用方法,以及在后续的工作中,如何将其应用到你的项目中。
现状与对策
在当前的开发环境下,我们常用的异步处理方式大概有以下这些:
Promise .all([promise1, promise2, promise3]) .then(([result1, result2, result3]) => { console.log(result1, result2, result3); }) .catch(error => { console.error(error); });
这虽然能够很好地处理你给出的异步请求数组,但是只要发生了一个错误,所有方法都会被中断,这导致我们无法在劳动力浪费的情况下找到已经处理结束的 Promise 对象。因此,我们需要一种新的方法,来保证所有 Promise 对象都能够被处理。
什么是Promise.allSettled()
?
Promise.allSettled()
方法返回一个 Promise 对象,该对象当所有给出的 Promise 都已经被解决后才会被解决。无论 Promise 对象完成成功还是失败,该方法都会一直执行,直到所有的 Promise 对象都被处理完毕。返回的结果数组中会包括处理后的每个 Promise 的结果,而它们的状态也可以在返回的值中被访问到。
Promise.allSettled()
的使用方法
要使用 Promise.allSettled()
,只需要将所有异步请求作为一个数组参数传递给它即可。
Promise .allSettled([promise1, promise2, promise3]) .then(results => { console.log(results); }) .catch(error => { console.error(error); });
其中的 results 包括每一个 Promise 所返回的结果,以及它们的状态。你可以通过尝试一下左侧的代码块来理解这个方法是如何工作的。
Promise.allSettled()
的结果
Promise.allSettled()
的结果数组中,每个 Promise 都会包含着标准属性的: status
and value
或 reason
。
status
表示该 Promise 结果状态的变化,可能的值为: "fulfilled" 表示可以取得该 Promise 的 value 值,"rejected" 表示该 Promise 处理失败;value
或者reason
属性包含着 Promise 对象的 resolved 或者 rejected 的理由。
例如:
Promise.allSettled([ Promise.resolve(1), Promise.reject(new Error("This Promise failed")), Promise.resolve(2) ]) .then(results => console.log(results));
将会输出:
-- -------------------- ---- ------- - - ------- ------------ ------ - -- - ------- ----------- ------- ------ ---- ------- ------ -- ---------------- -- - ------- ------------ ------ - - -
在代码中使用Promise.allSettled()
我们在实际的工程中经常会调用外部的 API 或者依赖其他的模块/库。我们通常需要获取这些依赖库后,将所有的东西都一起使用,但这往往是比较耗时的事情,因为你可能需要在一段时间内等关键依赖完成。
假设你需要从两个不同的API获取数据,你可以像下面这样使用Promise.allSettled()
:
-- -------------------- ---- ------- ----- ------------ - ------------------------------------------------ ----- ------------- - ------------------------------------------------- --------------------------------- --------------------------- -- - ---------------------- ------ -- - -- ------------- -- ------------ - ------------------ -------- ---------- ------------- - ---- - ------------------ -------- --------- -------------- - --- ---
在该代码块中,我们请求两个API的结果,使用 Promise.allSettled()
来处理所有的数据都已经获取完毕,在结果完成时打印消息。这个例子不是简单的处理成功数据,你们也可以把它推广到其他任何你需要的情况中。
结论
Promise.allSettled()
是一个很实用的异步处理工具,它还有很多其他的使用方法,也可以和其他工具,如 Async/await
结合来实现更多实用的功能。在以后的开发过程中,当你需要处理多个异步请求时,你应该了解这一工具,因为它将帮助你节省时间并更加高效地编写代码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6775023a6d66e0f9aaf2f0be