promise.all方法的实现过程及其使用

promise.all()方法接收一个数组作为参数,当数组的所有promise都是resolve状态时,promise.all()才会成功。若有一个失败,他便被认为是失败的。
以下封装一个promise.all方法,解释都在注释里。

function isPromise(v){ //判断是不是个promise 
    if(typeof v === 'function' || (typeof v === 'undefined' && v != null)){
        if(typeof v.then === 'function'){ //v.then是个函数,说明是个promise
            return true
        }
    }
    return false
}
Promise.all = function(values){ //传入一个数组
    return new Promise((resolve,reject)=>{
        let arr = []
        let i = 0
        let processData = function(key,value){ //key为all方法里传进来的数组得索引,value为对应resolve的值
            arr[key] = value
            if(++i === values.length){
                resolve(arr) //得到数组结果
            }
        }
        for(let i=0;i<values.length;i++){ //循环遍历一下传进来的这个数组
            let current = values[i] //令current=传进来的数组的每一项
            if(isPromise(current)){ //判断传进来的是promise还是普通数据
                current.then(y=>{ //是promise,then得出他的结果,将索引和结果传递给processData方法
                    processData(i,y)
                },reject)
            }else{
                processData(i,current) //不是promise,将索引和结果传递给processData方法
            }
        }
    })
}

promise.all()可以将多个promise实例包装成一个新的promise实例。成功时,返回的是个结果数组,失败时,返回的是最先被reject的值。
它通常用于处理多个异步操作,比如,在请求多个数据时候,页面上要等这些数据都回来时才能正常显示,数据没回来之前显示加载中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值