学无先后,达者为师

网站首页 编程语言 正文

手写Promise中all、race、any方法

作者:我的名字豌豆 更新时间: 2022-05-10 编程语言

all方法

// all: 传入的所有Promise最终都转化为fulfilled态时,则会执行resolve回调,并将返回值是的所有的Promise的resolve的回调的value的数组。
// 其中一个任何Promise为reject状态时,则返回的Promise的状态更改为rejected。
function all(arr) {
    //返回一个promise
    return new Promise((resolve, reject) => {
        let length = arr.length //传入的promise的个数
        let count = 0 //进入fullfilled的promise个数
        const result = [] //创建一个等长的数组,放置结果
        // 当传递是一个空数组,返回一个为fulfilled状态的promise
        if (arr.length === 0) {
            return new Promise.resolve(arr)
        }
        for (let i = 0; i < arr.length; i++) {
            arr[i].then(resolve => {
                result.push(resolve) //将每次结果保存在result数组中
                count++ //个数加1
                //是否所有的promise都进入fullfilled状态
                if (count === length) {
                    resolve(result) //返回结果
                }
            }).catch(e => {
                reject(e) //如果有错误则直接结束循环,并返回错误
            })
        }
    })
}

race方法

//race: 传入的所有Promise其中任何一个有状态转化为fulfilled或者rejected,则将执行对应的回调。
function race(arr) {
    return new Promise((res, rej) => {
        for (let i = 0; i < arr.length; i++) {
            arr[i].then(resolve => {
                res(resolve) //某一promise完成后直接返回其值
            }).catch(e => {
                rej(e) //如果有错误则直接结束循环,并返回错误
            })
        }
    })
}

any方法

// 只需要有一个成功的即可
function any(arr){
    return new Promise((resolve,reject) => {
        let result = []
        let len = arr.length
        let rejectCount = 0
        for(let i = 0;i<len;i++){
            arr[i].then(res => {
                resolve(res)
            }).catch(e => {
                result.push(e)
                if(rejectCount === len){
                    reject(result)
                }
            })
        }
    })
}

原文链接:https://blog.csdn.net/liu19721018/article/details/121515254

栏目分类
最近更新