ECMAScript 2021(ES12)中的 Promise.allSettled 改进了异步编程

· 约 4 分钟读完

随着前端技术的不断发展,异步编程已经成为了现代前端开发中不可或缺的一部分。在异步编程中,Promise 是一种非常常见的处理异步任务的方式。而在 ECMAScript 2021(ES12)中,新增加的 Promise.allSettled 方法,进一步改进了异步编程的方式。

Promise.allSettled 方法的作用

Promise.allSettled 方法的作用是接收一个 Promise 数组,返回一个新的 Promise 对象,该 Promise 对象在所有的 Promise 对象都完成(即 fulfilled 或者 rejected)后返回一个数组,该数组包含了所有 Promise 对象的状态。

与 Promise.all 方法不同的是,Promise.allSettled 方法不会因为某个 Promise 对象的状态为 rejected 而直接抛出异常,而是会等待所有的 Promise 对象都完成后,再返回一个包含所有 Promise 对象状态的数组。

Promise.allSettled 方法的语法

Promise.allSettled 方法的语法如下:

其中,iterable 参数是一个可迭代对象,通常为一个数组或者一个具有迭代能力的对象,比如 Set。

Promise.allSettled 方法的返回值

Promise.allSettled 方法返回的是一个新的 Promise 对象,该 Promise 对象的状态只有两种:fulfilled 和 rejected。

当所有 Promise 对象都完成后,该 Promise 对象的状态为 fulfilled,返回的值是一个数组,数组的每个元素都是一个对象,该对象包含了 Promise 对象的状态和值或者原因,具体如下:

  • 如果 Promise 对象的状态为 fulfilled,则该对象的 status 属性为 'fulfilled',value 属性为 Promise 对象的返回值。
  • 如果 Promise 对象的状态为 rejected,则该对象的 status 属性为 'rejected',reason 属性为 Promise 对象的拒绝原因。

Promise.allSettled 方法的示例代码

下面是一个使用 Promise.allSettled 方法的示例代码:

上面的代码中,我们定义了三个 Promise 对象,分别为 promise1、promise2 和 promise3,分别代表了一个成功的 Promise 对象、一个失败的 Promise 对象和一个需要等待 1 秒钟才能成功的 Promise 对象。

然后,我们使用 Promise.allSettled 方法来处理这三个 Promise 对象,最后在 then 方法中打印了所有 Promise 对象的状态和值或者原因。

执行上面的代码后,控制台输出的结果如下:

从输出结果中可以看出,Promise.allSettled 方法返回了一个数组,该数组包含了所有 Promise 对象的状态和值或者原因,其中 promise1 和 promise3 的状态为 fulfilled,promise2 的状态为 rejected。

Promise.allSettled 方法的指导意义

Promise.allSettled 方法的出现,进一步改进了异步编程的方式。通过使用 Promise.allSettled 方法,我们可以更加方便地在所有的异步任务完成后,统一处理它们的状态和值或者原因。

同时,Promise.allSettled 方法也可以帮助我们更好地处理异步任务中的异常情况。在使用 Promise.all 方法时,如果其中一个 Promise 对象被拒绝,整个 Promise 对象就会直接抛出异常,导致后续的代码无法执行。而使用 Promise.allSettled 方法时,即使其中一个 Promise 对象被拒绝,整个 Promise 对象也会继续执行,只是返回的数组中会包含该 Promise 对象的状态和原因。

因此,在实际开发中,我们可以根据具体的业务需求选择合适的 Promise 方法,以便更好地处理异步任务中的各种情况,提高代码的可读性和可维护性。

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