当前位置: 首页 > Web前端 > JavaScript

【手写题】实现一个批量请求函数multiRequest(urls,maxNum)

时间:2023-03-27 15:22:51 JavaScript

题目要求最大并发数maxNum。每当返回请求时,都会留下一个空缺以添加新的请求。所有请求完成后,会按照urls中的顺序依次打印出结果。//模拟请求函数request(url){returnnewPromise((resolve)=>{consttime=Math.random()*1000;setTimeout(()=>resolve(url),time);});}asyncfunctionmultiRequest(urls,maxNum){letdata=urls.map((url,index)=>({index,url}))//因为最终输出会有序,所以给每个url添加一个index属性来记录在数组中的位置,保证顺序Outputletresult=[]//存放结果的数组//巧妙使用Array.from,length是创建数组的长度,可以控制最大并发数。后面的回调方法用于存储异步请求函数letpromises=Array.from({length:Math.min(maxNum,data.length)},()=>getChain(data,result))//使用Promise.allconcurrentlyExecutetheasynchronousfunctionawaitPromise.all(promises)//通过函数参数returnresult接收最终结果}asyncfunctiongetChain(data,res=[]){//利用队列的思想弹出一个按一个执行,只要urls也一样,继续执行while(data.length){letone=data.pop()try{leturlRes=awaitrequest(one.url)//结果按索引顺序存储res[one.index]=urlRes}catch(e){res[one.index]=e}}}//调用consturls=['www.example1.com','www.example2.com','www.example3.com','www.example4.com','www.example5.com']multiRequest(urls,5)。然后(finalRes=>{console.log('done',finalRes)})