日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

手寫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

欄目分類
最近更新