异步任务批量执行结果获取
使用 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
目录