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。