As soon as you can reasonably introduce an ES6/7 transpiler into your toolchain you should start using ES7's async/await or equivalently ES6's generators + a coroutine library function like Bluebird.coroutine, Q.async, co, or Task.js.
It solves basically all of the problems mentioned in this article.
It solves basically all of the problems mentioned in this article.