I want to jump a function from a chain of waterfall functions with asyncjs in nodejs.
My code look like this :
async.waterfall([
function(next){
if(myBool){
next(null);
}else{
// Bypass the 2nd function
}
},
// I want to bypass this method if myBool is false in the 1st function
function(next){
},
// Always called
function(next){
}
]);
Do you know a proper way to do this without put :
if(!myBool){
return next();
}
In the function I want to bypass.
Thanks !
An alternative might be:
var tasks = [f1];
if(myBool){
tasks.push(f2);
}
tasks.push(f3);
async.waterfall(tasks, function(err, result){
});
where f1, f2, and f3 are your functions.
other than that, you're better off doing it explicitly, avoid making your code overly complicated, simpler is usually better
update:
function f1(done){
if(myBool){
f2(done);
}else{
done();
}
}
function f2(done){
async.nextTick(function(){
// stuff
done();
});
}
async.waterfall([f1,f3],function(err,result){
// foo
});
I think this should work:
var finalCallback = function(err, result){
if(err)
// handle error..
else
console.log('end! :D');
}
async.waterfall(
[
function step1(callback){
// stuff
callback(null, someData);
},
function step2(someData, callback){
if(skip_step_3)
finalCallback(null, someData);
else
callback(null, someData);
},
function step3(moreData, callback){
// more stuff
callback(null, moreData);
}
],
finalCallback
)
the creator of async recomend this in the github repo (https://github.com/caolan/async/pull/85)
Using if-async module your code will look like this:
var async = require('async')
var ifAsync = require('if-async')
async.waterfall([
foo,
ifAsync(p1).then(c1).else(c2),
bar
], function(err) {})
for full example take a look here: https://github.com/kessler/if-async#example-2-using-with-asyncjs-waterfall