解读 ES9 中 Promise 的新功能 --Promise.allSettled()

阅读时长 4 分钟读完

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 对象的状态是完成还是拒绝。

举个例子:

-- -------------------- ---- -------
----- -- - --- ----------------- ------- -- -
  ------------- -- -
    ---------------- - ------------
  -- -----
---

----- -- - --- ----------------- ------- -- -
  ------------- -- -
    --------------- - ------------
  -- -----
---

----------------------- ------------------- -- -
  ---------------------
---

运行结果如下:

从结果可以看出,Promise.allSettled() 返回了数组中所有的 Promise 对象的执行结果,包括完成和拒绝。

学习意义

在项目中经常会有需要多个异步操作同时执行的场景,例如需要同时请求不同的接口数据。针对这种情况,以前我们可以使用 Promise.all() 方法来解决,但是这种方法有一个致命弱点,某个 Promise 实例失败时,整个 Promise.all() 方法就会失败。

而 Promise.allSettled() 方法则不同,无论 Promise 成功与否,都会将所有状态全部汇总出来。这种处理方式对于多个异步操作的场景来说,可以更好地管理和处理异步操作的完成情况,提高代码的健壮性和可维护性。

总结

ES9 中新增的 Promise.allSettled() 方法,给前端开发带来了更多的操作,可以更细致地管理异步操作的状态和结果。在实际项目中,可以更好地满足复杂业务需求的同时提高代码的可读性和可维护性,是值得学习和掌握的一种解决异步操作的技巧。

希望本文可以为广大前端开发人员带来更多的帮助,学会这个方法之后,大家多多尝试,看看能不能写出一些好玩的东西哦!

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

纠错
反馈