JavaScript实现指定数量的并发限制的示例代码
在网上看到这么一道题:
这道题跟鱼头这篇记录『什么是时间分片(TimeSlicing)?』有点相似,但不同的是这次是限制异步并发的数量。
所以话不多说,我们先来康康实现
首先我们来实现一个分割数组的函数~
constgroup=(list=[],max=0)=>{ if(!list.length){ returnlist } letresults=[] for(leti=0,len=list.length;i这里就是根据指定的并发数量来分割数组。主要就是for+slice,这没啥好说的
接下来我们再来一个用async+await实现的请求集合封装。
我们通过for...of去遍历每一个异步函数,然后用async+await确保函数的执行顺序,再用try...catch来保证即使reject报错也不会导致无法继续执行任务。
constrequestHandler=async( groupedUrl=[], callback=()=>{} )=>{ if(!groupedUrl.length){ callback() returngroupedUrl } constnewGroupedUrl=groupedUrl.map(fn=>fn()) constresultsMapper=(results)=>results.map(callback) constdata=awaitPromise.allSettled(newGroupedUrl).then(resultsMapper) returndata; }接下来就是主函数
constsendRequest=async( urls=[], max=0, callback=()=>{} )=>{ if(!urls.length){ returnurls } constgroupedUrls=group(urls,max) constresults=[] console.log('start!') for(letgroupedUrlofgroupedUrls){ try{ constresult=awaitrequestHandler(groupedUrl,callback) results.push(result) console.log('go') }catch{} } console.log('done!') returnresults }这里就是利用了for+async+await来限制并发。等每次并发任务结果出来之后再执行下一次的任务。
我们执行下栗子:
constp1=()=>newPromise((resolve,reject)=>setTimeout(reject,1000,'p1')) constp2=()=>Promise.resolve(2) constp3=()=>newPromise((resolve,reject)=>setTimeout(resolve,2000,'p3')) constp4=()=>Promise.resolve(4) constp5=()=>newPromise((resolve,reject)=>setTimeout(reject,2000,'p5')) constp6=()=>Promise.resolve(6) constp7=()=>newPromise((resolve,reject)=>setTimeout(resolve,1000,'p7')) constp8=()=>Promise.resolve(8) constp9=()=>newPromise((resolve,reject)=>setTimeout(reject,1000,'p9')) constp10=()=>Promise.resolve(10) constp11=()=>newPromise((resolve,reject)=>setTimeout(resolve,2000,'p10')) constp12=()=>Promise.resolve(12) constp13=()=>newPromise((resolve,reject)=>setTimeout(reject,1000,'p11')) constp14=()=>Promise.resolve(14) constps=[p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14] sendRequest(ps,3,({reason,value})=>{ console.log(reason||value) })OK,我们看到结果是如我们所愿的
到此这篇关于JavaScript实现指定数量的并发限制的示例代码的文章就介绍到这了,更多相关JavaScript指定数量并发限制内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。