如何在 async.each 内部具有 async.waterfall 的外部函数中调用 async.each

How to call async.each in an external function having async.waterfall inside async.each

我在 Node.JS

中有一个导出模块
exports.doSomethingImportant= function(req, res) {
var id = req.params.id;
Demo.findOne({'_id': id})
  .exec(function(err, demosReturned) {
    async.waterfall([
        function(outerCallBack){
          console.log("In the First Call Back");
          firstOrderFunction(demosReturned,outerCallBack);
        },
        function(x,outerCallBack){
           var y =3 
           var z = x*y;
           console.log("In the Second Call Back");
           outerCallBack(null,z);
        }
      ],function(err,z){
        if(err){
          console.log("Error is == " +err);
        }else{
          console.log("The Returned Value is == "+z);
        }
      });
});//End Demo.findOne
};

现在,我的 firstOrderfunction 又有 async.each 嵌入 async.waterfall

function fistOrderFunction(demosReturned,outerCallBack){
console.log("Called the External Function");


async.each(demosReturned.locations, function(location, innerCallBack) {
  console.log('Computing Location #');

    async.waterfall([
          function(internalCallBack){
             console.log("Computing Inner First Waterfall");
               a = 14;
              innternalCallBack(null,a);
          },
          function(a,internalCallBack){
              console.log("Computing Inner Second Waterfall");
               b =14;
               c = a*b;
              innternalBack(null,c)
          }
      ],function(err,c){
        if(err){
          console.log("Error is == " +err);
        }else{
             d = c;
             console.log("The Returned Value is == "+c);
             innerCallBack(null,d);
        }
    });//End Async.Waterfall
},function(err,d){
    if(err){enter code here
      console.log("The Error in Async.Each === " + err);
    }else{
      console.log("The Returned Value is Processed ");
      outerCallBack(null, d);
    }
}); //End Async.Each
}

我得到的输出是


In the First Call Back

Called the External Function

Computing Location #

Computing Location #

Computing Inner First Waterfall

Computing Inner First Waterfall

The Returned Value is Processed

In the Second Call Back

The Returned Value is == NaN

我希望一切都运行按以下顺序同步。

  1. Call async.waterfall in exec call back of Demo.findone

  2. Call the firstOrderFunction

  3. Call async.each inside firstOrderFunction

  4. Call async.waterfall inside async.each

  5. Call the first callback function returning a=14.

  6. Call the second callback function returning c =14*14 =196.

如何使用异步实现此目的?

提前致谢,对于这么长的问题深表歉意。

在async.waterfall() 结束时调用async.each() 的回调,在async.each() 结束时调用firstOrderFunction 的回调。这是修改后的代码:

function fistOrderFunction(demosReturned, callback){
  var ret = [];

  console.log("Called the External Function");
  async.each(demosReturned.locations, function(location, eachCb) {
    console.log('Computing Location #');

    async.waterfall([
        function(waterfallCb){
            console.log("Computing Inner First Waterfall");
            a = 14;
            waterfallCb(null,a);
        },
        function(a,waterfallCb){
            console.log("Computing Inner Second Waterfall");
            b =14;
            c = a*b;
            waterfallCb(null,c)
        }
    ],function(err,c){
        if(err){
            console.log("Error is == " +err);
            eachCb(err);
        }else{
            ret.push(c);
            console.log("The Returned Value is == "+c);
            eachCb(null);
        }
    });//End Async.Waterfall
  },function(err){
    if(err){
        console.log("The Error in Async.Each === " + err);
        callback(err, null);
    }else{
        console.log("The Returned Value is Processed ");
        callback(null, ret);
    }
  }); //End Async.Each
}