The trick is learning how to compose promises out of one another. For instance, then() on a promise doesn&#x27;t just support a callback, but another promise or a function that returns another promise. Often you can build multiple async operations as chains and flows of promises. Additionally there are &quot;higher level&quot; compositions of promises such as Q.whenAll(promise1, promise2, ...).then(), making it easier to deal with things like parallel promises.<p>Also, it&#x27;s often cleaner to use something like Q.nfcall to turn a callback accepting function (like request in your example) itself into a promise that can be chained. (I just noticed that this is contrary to Q&#x27;s own documentation which surprisingly is pro-deferred.)