嵌套节点async.eachSeries

Nesting node async.eachSeries

本文关键字:eachSeries async 节点 嵌套      更新时间:2023-09-26

与异步模块斗争了半天,但在嵌套几个级别时无法使其正常工作。

所以这还可以:

var async=require('async')var myarr=["外部-A","外部-B"];var myarr2=["内部-A","内部-B"];var innerComplete=true;async.echSeries(myarr,function(item,outerCallback){console.log("处理项目"+项目);异步系列([函数(回调){takeTime(2000,项目,回调)},函数(回调){takeTime(1000,项目,回调)},函数(回调){outerCallback();}],函数(错误){console.log("---外部序列---")})},函数(错误){console.log("---OUTER LOOP---")});函数takeTime(ms、msg、callback){console.log("Starting"+ms+"ms task from"+msg);setTimeout(function(){console.log("已完成"+ms+"来自的ms任务"+msg);callback();},ms);}

它按照如下顺序很好地输出所有内容:

处理项目外部-A从外部-A启动2000毫秒任务已完成来自外部-A的2000毫秒任务从外部-A启动1000毫秒任务已完成来自外部-A的1000毫秒任务处理项目外部-B从外部-B启动2000毫秒任务已从外部完成2000毫秒的任务-B从外部-B启动1000毫秒任务已从外部完成1000毫秒的任务-B---外环---

但当我试图将另一个eachSeries循环嵌套到其中时,如下所示:

var async=require('async')var myarr=["外部-A","外部-B"];var myarr2=["内部-A","内部-B"];var innerComplete=true;async.echSeries(myarr,function(item,outerCallback){console.log("处理项目"+项目);异步系列([函数(回调){takeTime(2000,项目,回调)},函数(回调){takeTime(1000,项目,回调)},函数(回调){async.echSeries(myarr2,函数(item2,outerCallback2){console.log("处理项目"+项目2);异步系列([函数(回调2){takeTime(2000,第2项,回调2)},函数(回调2){takeTime(1000,第2项,回调2)}],函数(错误){console.log('---INNER SEQUENCE---')})},函数(错误){console.log("---INNER LOOP---")});outerCallback();}],函数(错误){console.log("---外部序列---")})},函数(错误){console.log("---OUTER LOOP---")});函数takeTime(ms、msg、callback){console.log("Starting"+ms+"ms task from"+msg);setTimeout(function(){console.log("已完成"+ms+"来自的ms任务"+msg);callback();},ms);}

当进入第二个eachSeries循环时,它会丢失执行顺序,如下所示:

处理项目外部-A从外部-A启动2000毫秒任务已完成来自外部-A的2000毫秒任务从外部-A启动1000毫秒任务已完成来自外部-A的1000毫秒任务处理项目内部-A从内部-A启动2000毫秒任务处理项目外部-B从外部-B启动2000毫秒任务已完成来自内部-A的2000毫秒任务从内部-A启动1000毫秒任务已从外部完成2000毫秒的任务-B从外部-B启动1000毫秒任务已完成来自内部-A的1000毫秒任务---内部序列---已从外部完成1000毫秒的任务-B处理项目内部-A从内部-A启动2000毫秒任务---外环---已完成来自内部-A的2000毫秒任务从内部-A启动1000毫秒任务已完成来自内部-A的1000毫秒任务---内部序列---

我也尝试了瀑布、mapSeries等,但执行顺序相同或混乱。我是做错了什么,还是异步模块不支持这样的嵌套?

您没有调用outerCallback2,也没有调用callback,而是立即调用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");
});