手写 Promise.allSettled
手写 Promise.allSettled
思路:
状态赋予函数 formatSettledResult
- 声明状态结果函数 formatSettledResult
- 成功:
{ status: 'fulfilled', value }
- 失败:
{ status: 'fulfilled', reason: value }
获取全部结果函数 allSettled
防御性:Array.from 转为数组
初始化
- 状态列表对应的数组
- 计数器 count
返回异步状态,只执行 resolve
- forEach 遍历:子项通过 then 获取异步结果
- 成功
- 状态赋予函数
- 只有当计数器全部执行完成返回
- 失败
- 状态赋予函数
- 只有当计数器全部执行完成返回
// 注意:此处不加括号,可直接返回对应数据
const formatSettledResult = (success, value) => (success ? { status: 'fulfilled', value } : { status: 'fulfilled', reason: value })
Promise.myAllSettled = list => {
// 创建key为请求数量的数组
const result = []
// 计数
let count = 0
// 所有异步状态通过resolve正确捕获
return new Promise(resolve => {
list.forEach((item, index) => {
item
.then(value => {
result[index] = formatSettledResult(true, value)
count++
// 全部执行结束:最后执行状态成功 =》返回全部
if (count === list.length) {
console.log('返回数据value')
resolve(result)
}
})
.catch(error => {
result[index] = formatSettledResult(false, error)
count++
// 全部执行结束:最后执行状态失败 =》返回全部
if (count === list.length) {
console.log('返回数据error')
resolve(result)
}
})
})
})
}
使用方法
var getData1 = Promise.resolve('1')
var getData2 = Promise.reject('error')
var getData3 = Promise.resolve('3')
const getAllData = [getData1, getData2, getData3]
// 获取全部异步状态
Promise.myAllSettled(getAllData).then(values => {console.log('values',values)})
{
0: {status: "fulfilled", value: "1"}
1: {status: "rejected", reason: "error"}
2: {status: "fulfilled", value: "3"}
}