Skip to main content

手写 Promise.allSettled

手写 Promise.allSettled

思路:

状态赋予函数 formatSettledResult

  1. 声明状态结果函数 formatSettledResult
  2. 成功:{ status: 'fulfilled', value }
  3. 失败:{ status: 'fulfilled', reason: value }

获取全部结果函数 allSettled

  1. 防御性:Array.from 转为数组

  2. 初始化

    • 状态列表对应的数组
    • 计数器 count
  3. 返回异步状态,只执行 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"}
}