节点js嵌套异步调用

时间:2016-04-05 13:33:43

标签: node.js express mean-stack mean

我想从getData函数执行异步调用到getImage函数但是我无法从getImage()获取返回数据。因为getData()不等待getImage()的完成,因为getImage()有进一步的异步db调用,因此getData()总是返回undefined。

执行此操作的最佳方法是做嵌套回调?

var getData  = function(id){  
async.series([            
        function(callback){                    
                  var res = getImages(id);                                                                     
                  callback(null, res);                                           
        }
    ],
  // optional callback
  function(err, results){

     if (err) {                      
         console.log("ERROR : " + err);
      }else 
      {           
              console.log("Result: "+results);              
      }
  });

}



var getImages  = function(id){ 

  async.series([            
        function(callback){ 
              Image.find({id: id }).exec(                    
                  function(err, image) { 
                    if (err) {
                         console.log(err);                                
                         callback(err, 0);
                      }else 
                      {     console.log("Count: "+ image.length);                                                                      
                            callback(null, image);                                              
                      }
              });                         
        }
    ],
  // optional callback
  function(err, results){

     if (err) {                     
         console.log("ERROR : " + err);
      }else 
      {                                 

              return results;          

      }
  });

}


getData(1);

2 个答案:

答案 0 :(得分:2)

正如你所说,你需要等待getImages()返回,然后你使用promises做到这一点。 使用任何承诺库,例如q

var q = require('q')
...
var getImages  = function(id){
  var deferred = q.defer();
  ...
  //do async logic that that evaluates some res obj you wish to return
  db.find(..., function() {
    deferred.resolve(res);
  }
  return deferred.promise;
}

然后,从getData()开始,您可以通过以下方式调用它:

getImages(id).then(
  function(res) {
    callback(null, res);
  },
  function(err) {
    console.log("error:" + err);
  }
);

答案 1 :(得分:0)

由于您已经在使用异步 - 只需使用waterfall功能:https://github.com/caolan/async#waterfalltasks-callback

通过这种方式,您可以一个接一个地运行功能并等待上一个功能完成,同时仍然可以获得它的返回值。