我想从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);
答案 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
通过这种方式,您可以一个接一个地运行功能并等待上一个功能完成,同时仍然可以获得它的返回值。