实现promise.all()

64 阅读1分钟
const isPromise = (fn)=>{
    return !!fn && Object.prototype.toString.call(fn) ==='[object Promise]'
}
const p1 = new Promise(resovle=>{
    setTimeout(()=>{
        resovle('p1 ok')
    },100)
})
const p2 = new Promise(resovle=>{
    setTimeout(()=>{
        resovle('p2 ok')
    },500)
})
const p3 = new Promise((re,reject)=>{
    setTimeout(()=>{
        reject('p3 ok')
    },1000)
})
const p4 = new Promise(resovle=>{
    setTimeout(()=>{
        resovle('p4 ok')
    },100)
})


const promiseAll = (args)=>{
    if(!args instanceof Array) return console.error('传参必须是个数组')
    return new Promise((resovle,reject)=>{
    let resovleSum = 0;
    const result = new Array(args.length)
    args.forEach((pfn,inx) => {
        if(isPromise(pfn)){
            pfn.then((res)=>{
                result[inx] = res;
                if(++resovleSum === args.length){
                    resovle(result)
                }
            }).catch(res=>{
                reject(res)
            })
        }else{
            result[inx] = pfn;
            if(++resovleSum === args.length){
                resovle(result)
            }
        }
    });
})
}

promiseAll([p1,p2,7,p3,p4]).then(res=>{
    console.log(res)
}).catch(res=>{
    console.log('S',res)
})