Thankfully, libraries like Async.js exist to try and curb the problem. Async adds a thin layer of functions on top of your code, but can greatly reduce the complexity by avoiding callback nesting.
Many helper methods exist in Async that can be used in different situations, like series, parallel, wa...