Node.js/Async - How to avoid callback hell with async?
node-async, node.js
Solution
There are ways to combat runaway nesting using functional programming techniques. I use the `curry` module to break loop bodies out into stand-alone routines; usually this carries a very minor performance hit versus nesting (study `curry` for why). Example:
var curry = require('curry'),
async = require('async');
var eachBody = curry(function(context, item, callback) {
callback(null, context + item); // first argument is error indicator
});
function exampleLoop(data, callback) {
// use the curried eachBody instead of writing the function inline
async.map(data, eachBody(data.length), callback);
}
function print(err, result) {
console.log(result);
}
exampleLoop([2, 4, 6], print); // prints [5, 7, 9]
exampleLoop([2, 4, 6, 7], print); // prints [6, 8, 10, 11]
Instead of:
var async = require('async');
function exampleLoop(data) {
async.map(data, function(item, callback) {
callback(null, data.length + item);
}, function(err, result) {
console.log(result);
});
}
exampleLoop([2, 4, 6]); // prints [5, 7, 9]
exampleLoop([2, 4, 6, 7]); // prints [6, 8, 10, 11]
The second example is more compact, but the more nesting you add, the less readable it becomes. Also, by splitting up the implementation, you can reuse component functions in multiple ways, and you can write unit tests for the individual component functions, not only for the high-level functionality.
Problem
I'm new to Node.Js and JavaScript web development on the backend. I see that callbacks inside callbacks could be a pain and there are modules to avoid that. One of these modules is async, https://github.com/caolan/async I've read the documentation but it is hard to start and understand how to do it. For example, I've this function "check_aut_user", How can I convert this code using async? ``` function check_auth_user(username, password, done) { var client = new pg.Client("pg://user:pass@127.0.0.1/database"); client.connect(function(err) { // If not get the connection if(err) { return console.error('could not connect to postgres', err); } // Query the user table client.query('select * from "user" where username = $1 and password = $2', [username, password], function(err, result) { if(err) { return console.error('error running query', err); } if (result.rowCount > 0) { var res = result.rows[0]; console.log(res); passport.serializeUser(function(res, done) { //console.log("serializer: " + res); done(null, res); }); passport.deserializeUser(function(user, done) { //console.log("deserializer: " + user['password']); done(null, res); }); return done(null, res); } else { return done(null, false); } }); }); } ``` Best Regards,