Promesas en AngularJS

Uno de los problemas que tarde o temprano nos encontramos al tratar de mostrar por pantalla datos remotos mediante Ajax, es que estos pueden tardar en llegar y no podemos bloquear el flujo del programa esperando a que lleguen. Para tratar con este tipo de problema AngularJS hace uso de las promesas.

Las promesas son objetos que representan el resultado de una acción que es realizada asíncronamente. Son muy útiles para trabajar con código asíncrono.

Al hacer una llamada Ajax con $http, la llamada a $http no retorna ningún valor ya que en ese momento todavía no sabe dicho valor, pero tampoco podemos bloquear el código esperando a que llegue. En realidad el servicio $http lo que retorna es una promesa, que viene a ser como un proxy que en un futuro contendrá el valor.

Para crear promesas, en AngularJS contamos con el servicio $q que contiene métodos para su manejo. Para ello debemos inyectar el servicio $q:

Mediante el método defer() del servicio $q obtenemos el objeto deferred. El propósito del objeto diferido (deferred) es proporcionar el uso de las promesas mediante tres métodos y una propiedad, que es la promesa.

Métodos del objeto deferred:
resolve(value)
reject(reason)
notify(value)

Propiedad del objeto deferred:
promise

Las promesas cuentan con los siguientes métodos:
then(successCallback, errorCallback, notifyCallback)
catch(errorCallback)
finally(callback)

Propiedad del objeto deferred:
promise

Nuestro controlador podría ser algo parecido a lo siguiente:

Como vemos, gracias a las promesas podemos tener datos que se obtienen de forma asíncrona sin preocuparnos de que bloqueen el resto de nuestra aplicación.