嵌套节点async.eachSeries
与asynchronous模块一起打了半天,但嵌套几个级别时无法正常工作。 由于代码有点冗长的职位,但请裸露在我身边,所有的代码应该运行良好。
所以这工作正常:
var async = require('async') var myarr = [“Outer - A”,“Outer - B”]; var myarr2 = [“Inner - A”,“Inner - B”]; var innerComplete = true; async.eachSeries(myarr,function(item,outerCallback){ console.log('处理项目'+项目); async.series([ 函数(callback){ takeTime(2000,item,callback) }, 函数(callback){ takeTime(1000,item,callback) }, 函数(callback){ outerCallback(); } ],函数(err){ console.log(“--- OUTER SEQUENCE ---”) }) },函数(err){ console.log(“--- OUTER LOOP ---”) }); 函数takeTime(ms,msg,callback){ console.log(“启动”ms + ms + ms +任务); setTimeout(function(){ console.log(“Finished”ms + ms + ms +任务); 回电话(); }, 女士); }
它按照如下顺序输出一切:
处理项目外 - A 从Outer - A开始2000 ms任务 从Outer - A完成了2000毫秒的任务 从Outer - A开始1000 ms的任务 从Outer - A完成了1000毫秒的任务 处理项目外 - B 从Outer - B开始2000 ms任务 从Outer - B完成了2000毫秒的任务 从Outer - B开始1000 ms的任务 从Outer - B完成1000毫秒的任务 ---外套---
但是,当我试图嵌套另一个eachSeries循环,如下所示:
var async = require('async') var myarr = [“Outer - A”,“Outer - B”]; var myarr2 = [“Inner - A”,“Inner - B”]; var innerComplete = true; async.eachSeries(myarr,function(item,outerCallback){ console.log('处理项目'+项目); async.series([ 函数(callback){ takeTime(2000,item,callback) }, 函数(callback){ takeTime(1000,item,callback) }, 函数(callback){ async.eachSeries(myarr2,function(item2,outerCallback2){ console.log('处理项目'+ item2); async.series([ 函数(callback2){ takeTime(2000,item2,callback2) }, 函数(callback2){ takeTime(1000,item2,callback2) } ],函数(err){ console.log('--- INNER SEQUENCE ---') }) },函数(err){ console.log(“--- INNER LOOP ---”) }); outerCallback(); } ],函数(err){ console.log(“--- OUTER SEQUENCE ---”) }) },函数(err){ console.log(“--- OUTER LOOP ---”) }); 函数takeTime(ms,msg,callback){ console.log(“启动”ms + ms + ms +任务); setTimeout(function(){ console.log(“Finished”ms + ms + ms +任务); 回电话(); }, 女士); }
进入第二个eachSeries循环时,它会丢失执行顺序:
处理项目外 - A 从Outer - A开始2000 ms任务 从Outer - A完成了2000毫秒的任务 从Outer - A开始1000 ms的任务 从Outer - A完成了1000毫秒的任务 处理项目内部 - A 从Inner - A开始2000毫秒的任务 处理项目外 - B 从Outer - B开始2000 ms任务 完成2000毫秒的内部任务 从Inner - A开始1000 ms的任务 从Outer - B完成了2000毫秒的任务 从Outer - B开始1000 ms的任务 Inner - A完成了1000毫秒的任务 ---内部序列--- 从Outer - B完成1000毫秒的任务 处理项目内部 - A 从Inner - A开始2000毫秒的任务 ---外套--- 完成2000毫秒的内部任务 从Inner - A开始1000 ms的任务 Inner - A完成了1000毫秒的任务 ---内部序列---
我也尝试了瀑布,mapSeries等,但以相同或以其他方式搞砸了执行顺序。 我做错了什么或不是asynchronous模块支持这种嵌套?
你没有调用outerCallback2
,你没有调用callback
, outerCallback
立即调用outerCallback
。
固定:
async.eachSeries(myarr, function( item, outerCallback) { ,----------------------------------------' | console.log('Processing item ' + item); | async.series([ | function(callback) { | `--------------, | takeTime(2000, item, callback) | }, | function(callback) { | `--------------, | takeTime(1000, item, callback) | }, | function(callback) { | ,-----------' | | async.eachSeries(myarr2, function( item2, outerCallback2) { | | ,---------------------------------------------' | | | console.log('Processing item ' + item2); | | | async.series([ | | | function(callback2) { | | | takeTime(2000, item2, callback2) | | | }, | | | function(callback2) { | | | takeTime(1000, item2, callback2) | | | } | | | ], function(err) { | | | console.log('---INNER SEQUENCE---') | | `---> outerCallback2(err); // <<< | | }) | | }, function(err){ | | console.log("---INNER LOOP---"); | `---> callback(err); // <<< | }); | } | ], function(err) { | console.log("---OUTER SEQUENCE---") `---> outerCallback(err); // <<< }) }, function(err){ console.log("---OUTER LOOP---") console.log("everything done"); });