Writing bad callback based code is easy and over the course of a project and without frequent code reviews; code can quickly become an unreadable tangled mess. Writing good callback based code comes with experience and is definitely worth it when you need to support some of the older browsers, although this can be alleviated through the use of transpilation. Promises are a great way to indicate the asynchronous nature of a function, they provide clarity over a function that can accept one or more callbacks. This is especially true when those callbacks take more parameters than the standard error, result. My point is that the Promise API provides a consistent method of writing asynchronous code. In my opinion, the true benefit of Promises is the ability to write asynchronous code in a synchronous way using async/await as this really improves the readability of the code. My team have a handful of C# developers, so using async/await syntax for their promises is like second nature.