I have a exports module in 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
};
Now, my firstOrderfunction
again has a async.each
embedding 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
}
The Output I get is
In the First Call Back
Called the External Function
Computing Location #
Computing Location #
Computing Inner First Waterfall
Computing Inner First Waterfall
The Returned Value is Processed
In the Second Call Back
The Returned Value is == NaN
I want everything to be run synchronously in the following order.
Call async.waterfall in exec call back of Demo.findone
Call the firstOrderFunction
Call async.each inside firstOrderFunction
Call async.waterfall inside async.each
Call the first callback function returning a=14.
Call the second callback function returning c =14*14 =196.
How do I achieve this using async?
Thanks in advance and apology for such a long question.
Call async.each()'s callback at the end of async.waterfall() and call firstOrderFunction's callback at the end of async.each(). Here is the revised code:
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
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.