部分摘自MDN
Promise.all(iterable)
- 此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve)
- 如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败的原因是第一个失败 promise 的结果。
我们来看例子1
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promiseList = [promise1,promise2]
Promise.all(promiseList)
.then((values) => {
console.log(20, values) //会输出3, 42
})
.catch(err => {
console.log(22, err)
})
例子2
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => reject('我是失败的Promise_1'))
const promise4 = new Promise((resolve, reject) => reject('我是失败的Promise_2'))
const promiseList = [promise1,promise2,promise3, promise4]
Promise.all(promiseList)
.then((values) => {
console.log(20, values) //不会走这里的回调
})
.catch(err => {
console.log(22, err) //输出 `我是失败的Promise_1` 只会返回第一个reject而中断
})
问题: 无法准确的定位错误,所以就有了Promise.allSettled
Promise.allSettled()
- 该Promise.allSettled()方法返回一个在所有给定的promise已被决议或被拒绝后决议的promise,并带有一个对象数组,每个对象表示对应的promise结果。
- 如果我们请求多个接口需要统计错误的次数,就可以用到此方法.
例子
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => reject('我是失败的Promise_1'))
const promise4 = new Promise((resolve, reject) => reject('我是失败的Promise_2'))
const promiseList = [promise1,promise2,promise3, promise4]
Promise.allSettled(promiseList).then(values=>{
console.log(26, values)
})
输出结果:
- promise 一共有三个状态pending、fulfilled、rejected(未决定,履行,拒绝)
Promise.all()模板
const arr = [1,2,3,4]
Promise.all(arr.map(val=>createPromise(val))).then(res=>{
console.log(36, res)
})
function createPromise(val) {
return new Promise(resolve => resolve(val))
}