我在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
我希望按以下顺序同步运行所有内容。
在Demo.findone的exec回调中调用async.waterfall
调用firstOrderFunction
- 中调用async.each
在firstOrderFunction
- 中调用async.waterfall
在async.each
调用第一个回调函数,返回a = 14。
- 醇>
调用第二个回调函数,返回c = 14 * 14 = 196。
如何使用异步实现此目的?
提前感谢并为这么久的问题道歉。
答案 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
}