js原生实现promise.all和promise.race

promise.all()

使用一个计数器计算所有的promise对象的个数,

const all = function (iterable) {
    return new Promise((resolve,reject)=>{
        let count = 0,ans = new Array(count)
        for(const i in iterable){  // 遍历所有的对象
            const v = iterable[i]
            if(typeof v === 'object' && typeof v.then ==='function'){ // 如果当前这个对象是promise类型
                v.then((res)=>{
                    ans[i] = res
                    if(--count===0) resolve(ans) // 当resolve时就count就-1,直到为0时整个promise变为resolve状态
                },reject) // 如果当前这个promise实例的状态为reject,整个promise就变为reject状态。
                count++ // 计算所有的promise类型的个数
            }else{
                ans[i] = v
            }
        }
    })
}
let p1 = new Promise((resolve)=>{setTimeout(resolve,200,1)})
let p2 = Promise.reject(2)
let p3 = 3
all([p1,p2,p3]).then((res)=>{
    console.log(res)
}).catch((err)=>{
    console.log(err)
})

promise.race

const race = function (iterable) {
    return new Promise((resolve,reject)=>{
        for(const i in iterable){
            const v = iterable[i]
            if (typeof v === 'object' && typeof v.then === 'function') {
                v.then(resolve, reject)
            } else {
                resolve(v)
            }
        }
    })
}
let p1 = new Promise((resolve)=>{setTimeout(resolve,200,1)})
let p2 = Promise.reject(2)
let p3 = 3
race([p1,p2,p3]).then((res)=>{
    console.log(res)
}).catch((err)=>{
    console.log(err)
})

你可能感兴趣的:(javascript)