En el enlace anterior pudimos entender el concepto que contextualiza el patrón promesa en el desarrollo de aplicaciones. En esta ocasión, veremos ejemplos de cómo se utiliza en aplicaciones desarrolladas con AngularJS. Pero primero, también es necesario introducir conceptos. Primeramente, comenzamos con el concepto diferido(deferred). Este objeto es el encargado de contener todo lo concerniente al patrón promesa. Ello quiere decir que mantiene el estado de la instrucción asíncrona que se ha realizado, para bloquear o no la ejecución de código.  De igual manera provee una interfaz para obtener los datos de dicho estado de ejecución. Al crearse este objeto primeramente el estado es pendiente, luego este es resuelto o rechazado.  De esta manera una llamada asíncrona no sabe cómo debe continuar, solamente avisa de que termina y luego podemos decidir que ejecutar cuando se complete, esta separación de acciones permite implementar las aplicaciones con bajo acoplamiento. AngularJS introduce el uso de las promesas en el servicio $q.

¿Cómo lo usamos? Bueno primeramente creamos el objeto deferred el cual expondrá el objeto promise, para llegar a los estados que se necesitan en la aplicación. Una técnica aconsejable en los métodos que lo utilicen es retornar siempre el objeto promise en vez del deferred. De esta manera se asegura solo acceder al estado de la petición asíncrona.

promise

Si la petición que realizamos devuelve los datos según lo esperado, entonces se plantea que se resuelve la promesa(resolve) en caso contrario ha ocurrido un error y se rechaza(reject). Una vez que se devuelve la promesa, sólo queda acceder al estado y establecerle las instrucciones según el estado que haya sido devuelto.

deferred

Cadena de promesas

Los valores obtenidos al igual que las promesas se pueden encadenar, de manera que se puede operar con valores tras la obtención de varios resultados en objetos promises.

chainpromise

Utilidades

El servicio que se expone a través de $q tiene varios métodos que se pueden utilizar en situaciones específicas sin recurrir a la creación de nuevos objetos promise. Supóngase que se quiere enviar siempre una promesa rechazada, en ese caso solo $q. reject(reason) se establecería dicha acción. De igual manera si siempre se quiere resolver una promise se utilizaría entonces $q. when(value). Y si se encuentra con varias peticiones asíncronas y no importa el orden de su resolución, entonces se utilizaría $q. all(promiseCollection).

Resumiendo

  • var deferred = $q. defer (); – crea un nuevo objeto diferido.
  • resolve(value); – resuelve el valor de un objeto diferido.
  • reject(reason); – rechaza un objeto diferido con su causa
  • var promise = deferred. promise; – se obtiene un promise
  • then (success, failure); – asigna funciones al resolverse un valor, de éxito o fallo.
  • catch(failure); – similar a promise. then (null, failure)).
  • finally(always); – función que siempre se llama no importa si hay éxito o fallo.

De esta manera, utilizando el patrón promise es las instrucciones de las aplicaciones se vuelven legibles, desacopladas, mantenibles durante el desarrollo de aplicaciones con AngularJS.

Fuente: http://www.webdeveasy.com/javascript-promises-and-angularjs-q-service/

Anuncios