ES9 新特性: Promise.allSettled() vs Promise.all()

阅读时长 4 分钟读完

前端开发中,JavaScript 的 Promise 是非常常用的异步编程解决方案之一。在 ES6 之后,Promise 的应用开始逐渐广泛起来,ES9 版本中新增了 Promise 的两个新方法:Promise.allSettled() 和 Promise.all()。本文将会详细介绍这两个方法的区别、使用场景以及示例。

Promise.allSettled()

Promise.allSettled() 方法返回一个 Promise,该 Promise 在所有给定的 Promise 都已经 fulfilled 或 rejected 后返回,返回一个所有 Promise 都被 settled 的 Promise 对象。当您需要等待一个 Promise 集合执行完成,并且您不关心任何 Promise 的状态,可以使用 Promise.allSettled()。

语法

参数

  • iterable:一个可迭代的 Promise 集合。通常是数组,但可以是其他可迭代对象(例如Set)。如果传入的参数不是迭代对象,则抛出一个 TypeError。

返回值

  • 返回一个 Promise 实例,结果为一个数组,每个元素反映每个 Promise 对象的执行结果。

具体的返回值如下:

  • 对于列表中的成功的 Promise,其结果将按顺序放到结果数组中,并且其状态为“ fulfilles”;
  • 对于列表中的失败的 Promise,该结果将按顺序放到结果数组中,并且其状态为“ rejected”。

示例代码

输出结果:

Promise.all()

与 Promise.allSettled() 类似,Promise.all() 方法返回一个 Promise 对象,该对象在所有 promise 都完成时确定完成状态。当您需要等待一个 Promise 集合执行完成,并且要知道其中任何一个 Promise 的状态,可以使用 Promise.all()。

语法

参数

  • iterable:一个可迭代的 Promise 集合。通常是数组,但可以是其他可迭代对象(例如Set)。如果传入的参数不是迭代对象,则抛出一个 TypeError。

返回值

返回一个全新的 Promise 实例,该实例同时执行多个 Promise 对象,并在所有 Promise 对象状态都完成时产生相应的结果。

具体的返回值如下:

  • 返回结果为 Promise 对象状态为 resolve;
  • Promise.all() 返回的 Promise 对象的值将是一个 Promise 列表,结果将按 Promise 列表顺序排序;
  • 如果 Promise 集合中的任何 Promise 被 rejected,则 Promise.all() 返回的 Promise 对象将 reject。

示例代码

输出结果:

区别与使用场景

  • Promise.allSettled() 方法的使用场景在于,当您需要等待一个 Promise 集合执行完成,并且您不关心任何 Promise 的状态。而 Promise.all() 方法当您需要等待一个 Promise 集合执行完成,并且要知道其中任何一个 Promise 的状态。
  • Promise.allSettled() 方法返回的 Promise 对象不会被 rejected。我们可以通过检查每个 Promise 对象的状态来获取结果;而 Promise.all() 方法返回的 Promise 对象可能会被 rejected,因为每个 Promise 对象状态的最终结果都与其他 Promise 对象的状态有关。

在使用时,我们可以根据具体的场景进行选择,以达到最佳的操作效果。

总结

本文介绍了 ES9 中的两个新方法,Promise.allSettled()和Promise.all() 方法。虽然两者非常相似,但它们的使用场景是不同的,而且它们返回的结果也有所不同。使用这些新方法可以提高代码的可读性和可维护性,以及优化异步编程流程。

希望本文能够帮助读者更好地利用 ES9 中的新特性。

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

纠错
反馈