Promise.all与allSettled

2,066 阅读1分钟

部分摘自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))
}