I know this sounds stupid, but I can't understand how to use async to handle existing asynchronous functions.
For example, consider some asynchronous function foo(arg1, arg2, ..., argN, callback) defined in some node module. Say I want to use this in async's waterfall(tasks,[callback]) function. How could I possibly do this? 
//original call
foo(x1,x2,xN, function goo(err, res) {
    // do something 
});
//using async
async.waterfall([
   function(callback) {
       foo(x1,x2,...,xN, callback);
   }
], function goo(err, res) {
   // do something
}); 
but I can't do that since callback needs to be called before the end of the function.
Help?