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);
}
);
我想从 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);
}
);