npm install async-if-else
This module adds if else conditional capabilities to async module.
Ever came across code like this on your async.waterfall
flow?
var async = require('async');
async.waterfall([
async.constant({email: '[email protected]', dogs: 2, money: 0, fun: 100 }),
updateUserEmailOrGetLegacy,
sendEmail
], handler);
function updateUserEmailOrGetLegacy(user, cb) {
emailExists(user.email, function (err, value) {
if (err)
callback(err)
else {
if (user.email)
updateAccount(user, cb);
else
importFromLegacyByEmail(user, cb)
}
})
}
Using async-if-else
you can have a conditional waterfall without the need of a wrapper function.
And the code is so much more readable, don't you agree?
var async = require('async-if-else')(require('async'));
function emailExists(user, callback) {
user.find(user.email, function(err, dbUser){
if (err)
return callback(error);
if(!dbUser)
return callback(null, false); // does not exist, predicate will be false
callback(null, true);
});
}
function updateAccount(user, callback) {
user.update( ..., callback);
}
function importFromLegacyByEmail(user, callback) {
remoteClient.get(user, callback);
}
async.waterfall([
async.constant({email: '[email protected]', dogs: 2, money: 0, fun: 100 }),
async.if(emailExists, updateAccount).else(importFromLegacyByEmail),
sendEmail
], handler);
You can also omit the else
and the function is only executed if the predicate is true.
var async = require('async-if-else')(require('async'));
async.waterfall([
async.constant({email: '[email protected]', dogs: 2, money: 0, fun: 100 }),
async.if(emailExists, auditLogging),
publishToQueue
], handler);
if you don't want to change the async object, you can always do something like that
var async = require('async');
var conditional = require('async-if-else')({});
async.waterfall([
async.constant({email: '[email protected]', dogs: 2, money: 0, fun: 100 }),
conditional.if(emailExists, auditLogging),
publishToQueue
], handler);
async.if()
async.if().else()
async.ifNot()
async.ifNot().else()
async.unless()
async.unless().else()
var conditionals = require('async-if-else')({});
var async = require('async-if-else')(require('async'));
async.if(predicateFn, expressionFn)
- predicateFn must validate the argument received from waterfall chain
function predicateFn(arg1 [, arg2 ...], callback) {}
callback signature is callback(error, truthyValue|falsyValue);
if you pass an error on first parameter the async.waterfall will skip below steps and goes directly to async.waterfall's callback function.
- expressionFn will execute when predicate is thruthy.
function expressionFn(arg1 [,arg2...], asyncWaterfallCallback)
async.if(predicateFn, expressionFn).else(elseExpressionFn);
- elseExpressionFn is executed when the if predicate is falsy or ifNot predicate is truthy.
function elseExpressionFn(arg1 [,arg2...], asyncWaterfallCallback)
ifNot works as the opposite of If receives exactly the same arguments
async.ifNot(predicateFn, expressionFn)
you could use with else as well
async.ifNot(predicateFn, expressionFn).else(elseExpressionFn)
The best way to get in touch is using the GitHub issues section.
If you can't find someone with the problem you are facing open a new issue and let me know.
If you manage to find a solution for your problem, you can submit a new PR :)
Let's make the world a better place by helping others.