Promises with Q are awesome. However, there's a lot of existing code done using callback-oriented structures. Much of this probably would have collapsed under its own weight long ago were it not for the excellent async.js. A number of the functions provided by async.js, e.g. parallel() aren't terribly useful to existing Q users, since you can just call Q.all(), but I've included most of the functions for completeness.