Node js嵌套异步调用

Node js nested async call

我想从 getData 函数异步调用 getImage 函数,但我无法从 getImage() 获取 return 数据。因为 getData() 不等待 getImage( ),因为 getImage() 有进一步的异步数据库调用,因此 getData() 总是 return 未定义。

替代嵌套回调的最佳方法是什么?

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);

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

这样您就可以 运行 一个接一个地执行函数并等待前一个函数完成,同时仍然得到它的 return 值。

正如您所说,您需要等待 getImages() 到 return,并且您使用 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);
  }
);