Promise 是 ES6 (ECMAScript 2015) 引入的一个功能,是用来管理 JavaScript 异步操作的一种解决方案。而 ES9 (ECMAScript 2018) 中,又新增了一个 Promise 的新功能 -- Promise.allSettled(),用于更好地管理 Promise 的状态。
Promise 基础
在深入了解 Promise.allSettled() 之前,先回顾一下 Promise 基础。
Promise 实例代表一个异步操作的最终完成 (或失败) 及其结果值。可以将其看做是一种代理者,可以让我们将异步操作放在代码中,但是不会影响主线程的执行。Promise 最重要的方法是 then(),catch() 和 finally()。
then() 方法接收两个参数,一个是处理 Promise 完成的回调函数,另一个是处理 Promise 失败的回调函数。而 catch() 方法则是专门用来处理 Promise 失败的回调函数。finally() 方法无论 Promise 成功/失败/挂起,都会执行一个回调函数。
举个例子:
-- -------------------- ---- ------- ----- - - --- ----------------- ------- -- - ------------- -- - ----- - - ------------- -- -- - ---- - ----------- - ---- - ---------- - -- ----- --- --------------- -- - -------------------- ----------- -------- ---------------- -- - -------------------- ----------- ------- ------------- -- - -------------------- -------- ---
Promise.allSettled()
Promise.all() 可以接收一个由 Promise 实例组成的数组,并等到数组里所有的 Promise 实例都完成时,返回一个新的 Promise 实例。这个新 Promise 返回一个数组,每个元素代表了原 Promise 数组中的 Promise 成功时返回的值。
Promise.allSettled() 也是接收一个 Promise 实例的数组作为参数,但是不管 Promise 实例是否成功,它总是会返回一个状态已经全部变成 settled 的 Promise 实例。这个 Promise 返回一个数组,数组中每个 Promise 对象的状态都是已完成(fulfilled),无论它原来的 Promise 对象的状态是完成还是拒绝。
举个例子:
-- -------------------- ---- ------- ----- -- - --- ----------------- ------- -- - ------------- -- - ---------------- - ------------ -- ----- --- ----- -- - --- ----------------- ------- -- - ------------- -- - --------------- - ------------ -- ----- --- ----------------------- ------------------- -- - --------------------- ---
运行结果如下:
[ { status: 'fulfilled', value: 'Promise 1 resolved.' }, { status: 'rejected', reason: 'Promise 2 rejected.' } ]
从结果可以看出,Promise.allSettled() 返回了数组中所有的 Promise 对象的执行结果,包括完成和拒绝。
学习意义
在项目中经常会有需要多个异步操作同时执行的场景,例如需要同时请求不同的接口数据。针对这种情况,以前我们可以使用 Promise.all() 方法来解决,但是这种方法有一个致命弱点,某个 Promise 实例失败时,整个 Promise.all() 方法就会失败。
而 Promise.allSettled() 方法则不同,无论 Promise 成功与否,都会将所有状态全部汇总出来。这种处理方式对于多个异步操作的场景来说,可以更好地管理和处理异步操作的完成情况,提高代码的健壮性和可维护性。
总结
ES9 中新增的 Promise.allSettled() 方法,给前端开发带来了更多的操作,可以更细致地管理异步操作的状态和结果。在实际项目中,可以更好地满足复杂业务需求的同时提高代码的可读性和可维护性,是值得学习和掌握的一种解决异步操作的技巧。
希望本文可以为广大前端开发人员带来更多的帮助,学会这个方法之后,大家多多尝试,看看能不能写出一些好玩的东西哦!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c0b1cf83d39b488150af01