jtwang7 / JavaScript-Note

JavaScript学习笔记
10 stars 2 forks source link

Promise.all 的错误捕获 #73

Open jtwang7 opened 2 years ago

jtwang7 commented 2 years ago

Promise.all 的错误捕获

在开发中,大多数时间都是一个异步操作一个异步操作去执行的,但是有一些特殊情况,需要一股脑去执行多个异步操作,比如:

❇️ Promise.all

Promise.all 的运行中我们发现,若 promises 中有一个请求出错的话,整体 promises 就会被中断且只会输出这个失败的状态,而忽略了其他成功的值。假如我们不希望某种错误影响到并行请求的结果输出时,就需要对 Promise.all 做一层静默处理:

✅ 方法一:在传入 promises 前,先对 promises 中的每个 promise 对象都优先捕获自身的错误,防止错误向外传播到 Promise.all 方法内。

const fun = async (promises) => {
  Promise.all(
    promises.map(promise => {
      return promise.catch(err => err)
    })
  )
    .then(res => {
      console.log('res', res)
    })
}

fun([request(1000), request(500, false)])
// res [ '成功了1000', '失败了500' ]

✅ 方法二:在ES2020中,JavaScript提供了一个新语法 Promise.allSettled,他能直接完成我们上面所做的处理 Promise.allSettled

const fun = async (promises) => {
  Promise.allSettled(promises)
    .then(res => {
      console.log('res', res)
    })
}

fun([request(1000), request(500, false)])
// res [
//   { status: 'fulfilled', value: '成功了1000' },
//   { status: 'rejected', reason: '失败了500' }
// ]