The Promise API's true value lies in lifting control out of the compiler's hands, and into the hands of our runtime, using a very simple structure. Rather than the syntax of the source code being the only description of the relationship between pieces of code (e.g. a callback pyramid), now we have a simple API for storing and using those relationships.
TL;DR The core API of a Promise object should be:
.wait(cb) # cb gets (err, result)
.finish(result) # cb will get (undefined, result)
.fail(err) # cb will get (err, undefined)