Если я правильно понял вопрос, как удобно построить цепочку вызывающих себя через callback'и функций с передачей данных следующей функции, то с использованием async это пишется так:
var async = require('async');
async.waterfall([
function(callback){
setTimeout(function() {
console.log('f1 done');
callback(null, 'data from f1');
}, 100);
},
function(data, callback){
// работа с data
// или расширение цепочки через функцию f3, которая по окончании работы вызовет callback
// f3(callback);
console.log('f2 done');
callback(null, 'done');
}
], function (err, result) {
// result now equals 'done'
if (err) {
// единое место для отлова ошибок
}
console.log(result);
});