再手写个all、any和allSettled吧

56 阅读1分钟

Promise.all

所有元素状态都为resolve时就返回整个数组(fullfiled),有一个为rejected就返回那一个rejected的对象

function myAll(promises){
    return new Promise(
        let res = []
        let count = 0
        promises.forEach((item, i) => {
            item.then(
                value => {
                    res[i] = value
                    count ++
                    if(count == promises.length){
                    resolve(res)
                    },
                err => reject(err)
            })
        })
    )
}

Promise.any

有一个元素状态为resolve就直接返回那一个resolve对象,全为rejected则返回整个数组(rejected)

function myAny(promises){
    return new Promise(
        let res = []
        let count = 0
        promises.forEach((item, i) => {
            item.then(
                value => resolve(value),
                err => {
                    res[i] = err
                    count ++
                    if(count == promises.length){
                    reject(res)
                }
            )
        })
    )
}

Promise.allSettled

数组中所有元素状态都发生变更时,返回整个数组(fullfiled)

function myAllSettled(promises){
    return new Promise(
        let res = []
        let count = 0
        promises.forEach((item, i) => {
            item.then(
                value => res[i] = value,
                err => res[i] = err
            ).finally(() => {
                count ++
                if(count == promises.length){
                    resolve(res)
                }
             })
        })
    )
}