前端开发中,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()。
语法
Promise.allSettled(iterable);
参数
- iterable:一个可迭代的 Promise 集合。通常是数组,但可以是其他可迭代对象(例如Set)。如果传入的参数不是迭代对象,则抛出一个 TypeError。
返回值
- 返回一个 Promise 实例,结果为一个数组,每个元素反映每个 Promise 对象的执行结果。
具体的返回值如下:
- 对于列表中的成功的 Promise,其结果将按顺序放到结果数组中,并且其状态为“ fulfilles”;
- 对于列表中的失败的 Promise,该结果将按顺序放到结果数组中,并且其状态为“ rejected”。
示例代码
Promise.allSettled([ Promise.resolve('success'), Promise.reject('failure') ]).then(results => { console.log(results); });
输出结果:
[ { status: 'fulfilled', value: 'success' }, { status: 'rejected', reason: 'failure' } ]
Promise.all()
与 Promise.allSettled() 类似,Promise.all() 方法返回一个 Promise 对象,该对象在所有 promise 都完成时确定完成状态。当您需要等待一个 Promise 集合执行完成,并且要知道其中任何一个 Promise 的状态,可以使用 Promise.all()。
语法
Promise.all(iterable);
参数
- iterable:一个可迭代的 Promise 集合。通常是数组,但可以是其他可迭代对象(例如Set)。如果传入的参数不是迭代对象,则抛出一个 TypeError。
返回值
返回一个全新的 Promise 实例,该实例同时执行多个 Promise 对象,并在所有 Promise 对象状态都完成时产生相应的结果。
具体的返回值如下:
- 返回结果为 Promise 对象状态为 resolve;
- Promise.all() 返回的 Promise 对象的值将是一个 Promise 列表,结果将按 Promise 列表顺序排序;
- 如果 Promise 集合中的任何 Promise 被 rejected,则 Promise.all() 返回的 Promise 对象将 reject。
示例代码
Promise.all([ Promise.resolve('success'), Promise.reject('failure') ]).then(results => { console.log(results); }).catch(error => { console.log(error); });
输出结果:
'failure'
区别与使用场景
- 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