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

时间:2015-04-01 04:20:53

标签: javascript node.js asynchronous express mongoose

我在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
}

我得到的输出是


  

在第一次回电中

     

调用外部函数

     

计算位置#

     

计算位置#

     

计算内部第一瀑布

     

计算内部第一瀑布

     

已处理退回的值

     

在第二次回电中

     

返回值为== NaN

我希望按以下顺序同步运行所有内容。

  
      
  1. 在Demo.findone的exec回调中调用async.waterfall

  2.   
  3. 调用firstOrderFunction

  4.   
  5. 在firstOrderFunction

  6. 中调用async.each   
  7. 在async.each

  8. 中调用async.waterfall   
  9. 调用第一个回调函数,返回a = 14。

  10.   
  11. 调用第二个回调函数,返回c = 14 * 14 = 196。

  12.   

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

提前感谢并为这么久的问题道歉。

1 个答案:

答案 0 :(得分:1)

在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
}