异步任务批量执行结果获取

使用 Promise.all 和 Promise.allSettled 获取多个异步任务的执行结果

问题

遍历一个任意长度的数组并依次创建异步任务,如何获取所有任务的执行结果?

解答

Promise.all

Promise.all 接收一个 Promise 数组,当所有 Promise 都成功时返回结果数组,任何一个失败则立即返回第一个失败的结果。

const p1 = new Promise((resolve, reject) => {
  resolve('成功了')
})
const p2 = Promise.resolve('success')
const p3 = Promise.reject('失败')

Promise.all([p1, p2]).then((result) => {
  console.log(result)  // ["成功了", "success"]
}).catch((error) => {
  // 未被调用
})

Promise.all([p1, p3, p2]).then((result) => {
  // 未被调用
}).catch((error) => {
  console.log(error)  // "失败"
})

Promise.allSettled

Promise.allSettled 等待所有 Promise 完成(无论成功或失败),返回包含每个 Promise 状态和结果的对象数组。

Promise.allSettled([p1, p2, p3])
  .then(values => {
    console.log(values)
    // [
    //   { status: 'fulfilled', value: '成功了' },
    //   { status: 'fulfilled', value: 'success' },
    //   { status: 'rejected', reason: '失败' }
    // ]
  })

关键点

  • Promise.all 遇到第一个失败就会中断,只返回第一个失败的原因
  • Promise.allSettled 会等待所有任务完成,返回每个任务的状态和结果
  • 需要获取所有任务结果(包括失败的)时使用 Promise.allSettled
  • 需要所有任务都成功才继续时使用 Promise.all