JavaScript 中的 Promise.all() 方法与 Promise.allSettled() 方法有何不同?

1. Promise.all() 方法与 Promise.allSettled() 方法介绍

在JavaScript中,Promise.all()和Promise.allSettled()都是用于将多个Promise对象结果合并展示的方法,但二者有着本质的区别。

Promise.all()

Promise.all()方法接收一个Promise对象数组作为参数。当数组中所有的Promise对象都成功执行后,Promise.all()方法返回一个新的Promise对象,该Promise对象的解析值是一个结果数组,该数组的值与原始Promise数组中的Promise对象的值一一对应。如果其中任何一个Promise对象失败,则整个Promise.all()方法在失败的那个Promise对象返回的结果的基础上失败,错误消息将是第一个失败Promise对象返回的错误消息。

Promise.allSettled()

Promise.allSettled()方法接受一个Promise对象数组作为参数,并在所有Promise对象都已完成(fulfilled 或 rejected)时返回一个Promise对象,该Promise对象包含一个对象数组,每个对象表示对于原始数组中的 Promise 对象的结果。每个对象包含以下属性:

status: 对应状态字符串,可能的值是fulfilled或rejected。

value: 成功的返回值,如果status为rejected,则没有值。

reason: 拒绝时的错误信息,如果status为fulfilled,则没有值。

2. Promise.all() 方法与 Promise.allSettled() 方法区别

2.1 处理方式不同

Promise.all()中的Promise对象遵循快速失败迭代器的规则。简单来说,即在出现错误的情况下,Promise.all()不会继续迭代Promise对象,而是直接返回未解决的错误。这意味着如果数组中有一个被拒绝的Promise对象,Promise.all()方法将立即失败并返回第一个失败的Promise对象。

相反,Promise.allSettled()方法会等待所有Promise对象都结作,哪怕是有一个Promise对象状态为rejected,也不会立即失败。因此,Promise.allSettled()方法可以帮助处理由Promise.all()无法解决的一些异常情况。

2.2 返回值不同

Promise.all()返回的是一个新的Promise对象,该Promise对象的解析值是一个结果数组,该数组的值与原始Promise数组中的Promise对象的值一一对应。

而Promise.allSettled()返回的是一个Promise,该Promise对象的结成值是一个对象数组,其中包含每个原始Promise对象的信息。每个对象都包含3个属性:状态、成功值和失败原因。

3. 示例

3.1 Promise.all() 示例

const promise1 = Promise.resolve('Success 1')

const promise2 = Promise.resolve('Success 2')

const promise3 = Promise.reject('Error 3')

Promise.all([promise1, promise2, promise3])

.then(function(values) {

console.log(values)

})

.catch(function(e) {

console.log(e)

})

在上面这个例子中,由于promise3是拒绝的Promise对象,因此Promise.all()将立即拒绝并返回失败的Promise对象。

3.2 Promise.allSettled() 示例

const promise1 = Promise.resolve('Success 1');

const promise2 = Promise.reject('Error 2');

const promise3 = Promise.resolve('Success 3');

Promise.allSettled([promise1, promise2, promise3])

.then(function(results) {

console.log(results);

});

在这个例子中,Promise.allSettled()会等待所有Promise对象的状态都被解决,即使promise2失败了,也会继续等待其他Promise对象的状态。

4. 总结

Promise.all()和Promise.allSettled()方法可以帮助我们处理多个Promise对象的并行任务。如果你的Promise对象中的任务彼此独立且互不依赖,则可以使用Promise.all(),因为这可以极大地减少整体运行时间。但是如果你需要更多的控制并且需要等待所有Promise都完成,无论结果如何,那么你应该使用Promise.allSettled()方法。无论哪种情况,Promise.all()和Promise.allSettled()都是具有强大功能的Promise API。