I would add that there is a fantastic video series and book by Kyle Simpson that goes over the then vs. now of asynchronous abstractions in JavaScript.
Beyond Promises, we have actually two more asynchronous constructs that have been introduced in the newer releases of JavaScript: Generator Functions and Async Await.
Note: Generator functions have already been finalized in the ECMA standard while Async Await will be in the next release, but both can be used right now with Babel, Traceur, or any other transpiler.