怎么利用promise.all实现并发控制

72 阅读1分钟

听说这个题很火我也来试试 关键点在于promise.all的then继续调用run函数。思想有点类似于co模块



function limitRequest(urlLists,limit){

    // 记录已经发送的数量
    let hasSend = 0
    // 结果集
    let resultList = []
   /**
    * 获取请求或者是promise对象
    * @returns 返回一个数组
    */
    const getSlice = function(){
        let urls =  urlLists.slice(hasSend,hasSend + limit)
        hasSend = hasSend + limit
        let reqs = urls.map(url=>new Promise((resolve,reject)=>{resolve(hasSend)}))
        return reqs
    }
    const run = function(reslove,reject){
        Promise.all(getSlice()).then(res=>{
           
            resultList = resultList.concat(res)
            
            if(hasSend >= urlLists.length){
                // 如果结果数量够了,就返回
                reslove(resultList)
            }else{
                // 继续调用自身
                run(reslove,reject)
            }
        }).catch(err=>reject(err))
 
     }
    //  必须返回一个promise
    return new Promise((reslove,reject)=>{
        run(reslove,reject)
    }
    )

}

let url = ["1","2","3","4"]

limitRequest(url,3).then(res=>{
    console.log("res是",res)
})