手写一个Promise.all


首先看Promise.all的定义

Promise.all(iterable)方法返回一个 Promise 实例,此实例在 iterable 参数内所有的 promise 都“完成(resolved)”或参数中不包含 promise 时回调完成(resolve);如果参数中 promise 有一个失败(rejected),此实例回调失败(reject),失败原因的是第一个失败 promise 的结果。

function all(promiseArr){
    let index = 0;//记录promise完成数
    let result = [];//记录promise结果

    //all方法返回的是一个promise
    return new Promise((resolve,reject)=>{
    promiseArr.forEach((p,i)=>{
        //让非promise也能返回
        Promise.resolve(p)
        .then((res)=>{
            //保存每项结果到每项
            result[i]=res;

            //全部完成返回结果
            if(++index === promiseArr.length){
                resolve(result)
            }
        })
        .catch((e)=>{
            //有一个promise发生错误立即返回
            reject(e);
        })
    })
    })
}

//测试
let arr = [Promise.resolve("successA"),Promise.resolve("successB"),Promise.resolve("successC")]

all(arr).then((res)=>{console.log("全部成功",res)}).catch((err)=>{console.log("有个失败了",err)})

文章作者: iamfugui
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 iamfugui !
评论