Patrón Promises


En javascript solemos realizar programación asíncrona, con el objetivo de no bloquear el trabajo del usuario (“aplicaciones responsivas”).

Problema

A media que el código crece en complejidad, la situación habitual es realizar un serie de cadenas de callbacks. Nos vemos obligados a crear una función que encadena callbacks o crear callbacks anidados.

// callback encadenados.
function done1() { alert('done1');};
function done2() { alert('done2');};
$.ajax({ url: "/callService"
   	     sucess: function() {done1(); done2(););

// callback Andidados
function done1(done2) {
	alert('done1');
	done2();
}		 	 
$.ajax({ url: "/callService"
   	     sucess: function() { done1(done2); );

Patrón Promise al rescate

Aquí viene a nuestra ayuda el patrón Promises. Nos ofrece una manera más simple de realizar los callbacks.
Promise nos devuelve una tarea, que nos posibilita encadenar los “callbacks” limpiamente.

$.when(tarea).then(done1).then(done2);

Se estructura de la siguiente manera:

  • when: Tarea/s que se realica/en.
  • then: Aquí ponemos los métodos de callback que queremos que se ejecuten al finalizar las tareas lanzadas. Podemos tener un callback de tarea acabada exitosamente o de error.

jQuery (como otras librerias de javascript), incorporan dicho patrón. Bajo el objecto Deferred. Para crear una tarea, retornamos un objecto Deferred. jQuery Ajax ya encapsula por defecto el objecto Deferred.

function promise() {
	var xhr = $.ajax({ url: "/callService");
	return xhr;
}
$.when(promise()).then(done1);

De todas maneras podemos crearnos el objecto Deferred y utilizarlo de manera más avanzada.

function promise() {
	var deferred = $.Deferred();
	var xhr = $.ajax({ url: "/callService",
				   success: function() { 
						...
						deferred.resolve();   //Provoca que se ejecute el callback existoso del then
						}, 
				   error: function() {
						...
						deferred.reject();    //Provoca que se ejecute el callback de error del then
				   });
	return deferred;	
}			   
$.when(promise()).then(done);

Conclusión

Este patrón simplifica enormemente la legibilidad y mantenimibilidad del código. Pero este patrón también se puede aplicar a C#. En el siguiente artículo se ve como Promise Pattern en C#

Anuncios
Esta entrada fue publicada en Desarrollo, javascript, web. Guarda el enlace permanente.

Una respuesta a Patrón Promises

  1. Pingback: Primera aplicación en Angularjs (II) | Pensando bajo la lluvia

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s