While callbacks are OK when making individual requests, they tend to get messy when you need to do nested callbacks. This is where promises come in handy, as they can be easily chained.
As per the proposal at CommonJS, "Promises provide a well-defined interface for interacting with an object that represents the result of an action that is performed asynchronously, and may or may not be finished at any given point in time."
Promises in AngularJS are implemented via the
$q service, which is based on the Q Library by Kris Kowal. It is available at https://github.com/kriskowal/q.