当前位置: 首页 > 后端技术 > Node.js

node.js 多个异步过程判断执行是否完成

时间:2023-04-03 22:52:01 Node.js

多个node.js异步进程判断是否执行完成一次处理100项;所有请求完成后,统一处理。这样的应用场景可以这样处理:方案一:判断请求的数据入口//模拟一个网络请求functionfetch(url,callback){setTimeout(function(){callback(null,{subjects:[{data:Math.round(Math.random()*100)}]});},2000);}//实现方案1functionmultiTask_1(){vararr=[];varbaseUrl='https://api.douban.com/v2/movie/top250';for(varstart=0;start<10;start++){varurl=baseUrl+'?start='+start+"&count=1";fetch(url,function(error,res){vardata=res.subjects;arr=arr.concat(data);//调用完成后统一处理if(arr.length===10){console.log(arr);}});}}将运行结果由arr.length判断。如果arr.length不是我们期望的,比如因为网络传输或者处理异常,少了一项,那么我们就无法进行后续的处理。这种处理方式业务耦合性强;它不是通用的。方案二:判断异步流程执行次数//方案二functionmultiTask_2(){vartaskWatcher=0;变量arr=[];varbaseUrl='https://api.douban.com/v2/movie/top250';for(varstart=0;start<10;start++){taskWatcher++;varurl=baseUrl+'?start='+start+"&count=1";fetch(url,function(error,res){vardata=res.subjects;arr=arr.concat(data);taskWatcher--;if(taskWatcher===0){console.log(arr);}});}}方案2的判断条件,其中taskWatcher作为一个异步任务执行observer只与异步进程的调用次数有关,与其他处理进程无关。还有其他解决办法吗?方案三:Promise.all()Promise.all(iterable)方法返回一个Promise,在上述iterable对象中的所有Promise都被resolved之后,或者任意一个Promise被rejected之后reject。functionmultiTask_3(){//vartaskWatcher=0;vartaskStack=[];变量arr=[];varbaseUrl='https://api.douban.com/v2/movie/top250';for(varstart=0;start<10;start++){taskStack.push(newPromise((resolve,reject)=>{varurl=baseUrl+'?start='+start+"&count=1";fetch(url,function(error,res){vardata=res.subjects;arr=arr.concat(data);resolve();});}));}Promise.all(taskStack).then(function(){console.log(arr);});}这个方法比较通用,如果异步任务类型不同,也可以这样解决。但应注意废品的处理。避免其对最终加工的影响。方案四:EventProxyEventProxy是朴玲写的,https://github.com/JacksonTian/eventproxyvarep=newEventProxy();变量arr=[];ep.after('fetchData',10,function(list){list.forEach(function(item){arr=arr.concat(item);});console.log(arr);});varbaseUrl='https://api.douban.com/v2/movie/top250';for(varstart=0;start<10;start++){varurl=baseUrl+'?start='+start+"&count=1";fetch(url,function(error,res){vardata=res.subjects;ep.emit('fetchData',data);});}EventProxy基于事件订阅/发布模式,after方法可以监听多个事件,回调中保存多个异步任务的数据结果数组;此外,EventProxy还支持对多个不同事件的监听和处理。