手写 Promise.all/any/race/allSettled

Promise 身上的这些方法返回的都是一个 PromisePromise.resolve 接受一个 Promise,若非 promise 则将其变成功状态的 Promise

Promise.all

Promise.all 有一个失败则返回失败的结果,全部成功返回全成功的数组

Promise.all=function (promiseList= []) {
    returnnewPromise((resolve, reject) => {
        if (promiseList.length===0) returnresolve([])
        constresult= []
        letcount=0
​
        for (leti=0; i<promiseList.length; i++) {
            Promise.resolve(promiseList[i]).then(res=> {
                result[i] =res
                count++
                // 不能直接通过 result.length 进行比较,因为会存在下标大的先赋值
                // 例如 i = 3 第一个返回结果,此时数组变为[empty,empty,empty,res]
                if (count===promiseList.length) {
                    resolve(result)
                }
            }).catch(e=> {
                reject(e)
            })
        }
    })
}

Promise.any

Promise.any 和 Promise.all 相反,全部失败返回失败的结果数组,有一个成功则返回成功结果AggregateError,当多个错误需要包装在一个错误中时,该对象表示一个错误。

Promise.any=function (promiseList= []) {
    returnnewPromise((resolve, reject) => {
        if (promiseList.length===0) returnresolve([])
        constresult= []
        letcount=0
        for (leti=0; i<promiseList.length; i++) {
            Promise.resolve(promiseList[i]).then(res=> {
                resolve(res)
            }).catch(e=> {
                result[i] =res
                count++
                if (count===promiseList.length) {
                    reject(newAggregateError(result))
                }
            })
        }
    })
}

Promise.race

Promise.race 返回第一个成功或失败的结果

Promise.race=function (promiseList= []) {
    returnnewPromise((resolve, reject) => {
        if (promiseList.length===0) returnresolve([])
        for (leti=0; i<promiseList.length; i++) {
            Promise.resolve(promiseList[i]).then(res=> {
                resolve(res)
            }).catch(e=> {
                reject(e)
            })
        }
    })
}

Promise.allSettled

Promise.allSettled 无论成功与否都返回,但是会添加一个 status 字段用于标记成功/失败

Promise.allSettled=function (promiseList= []) {
    returnnewPromise((resolve,reject) => {
        if (!promiseList.length) returnresolve([])
        constresult= []
        letcount=0
​
        constaddRes= (i, data) => {
            result[i] =data
            count++
            if (count===promiseList.length) {
                resolve(result)
            }
        }
​
        for (leti=0; i<promiseList.length; i++) {
            Promise.resolve(promiseList[i]).then(res=> {
                addRes(i, {status: 'fulfilled', data: res})
            }).catch(e=> {
                addRes(i, {status: 'rejected', data: e})
            })
        }
    })
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值