Introducción a las promises de Q.js

Q.js es una librería que nos permite trabajar de forma eficaz con promises en javaScript

Fernand Leger

archivado en: JavaScript / 19 agosto, 2014 / taller:

Este post está dedicado a mi amigo Arturo  Batanero, que me enseñó estas cosas tan chulas : ).

Con javaScript es complicado trabajar  con operaciones asíncronas, es decir, con operaciones que se lanzan y que no se espera a que devuelvan un resultado para seguir lanzando otras, como ocurre con las llamadas AJAX. Por ejemplo, en este caso:

<script>

function primeraFuncion() {

setTimeout("alert('Primera función')", 2000);

}

function segundaFuncion() {

setTimeout("alert('Segunda función')", 1000);

}

primeraFuncion();

segundaFuncion();

</script>

El alert de la segunda función se mostrará antes que el primero aunque se haya lanzado después, ya que javaScript no se espera a que termine el primer setTimeout, que es asíncrono, sino que sigue ejecutando el código. Si necesitáramos que la segunda se ejecutase solo cuando hubiera concluido de verdad la primera, podríamos hacer un callback, pero esta solución se queda corta en las situaciones reales, donde el código es mucho más complejo que estos miserables alerts. Por el contrario, otra solución mucho más elegante y escalable es utilizar promesas.

Q.js

En esencia, un sistema de promises consiste en detener el flujo del código hasta que no se haya ejecutado hasta el final una operación y se haya devuelto un resultado, ya sea para indicar que ha salido bien o que ha salido mal. Disponemos de varias librerías, incluida jQuery, para implementar un sistema de promesas, pero la más eficaz es Q.js, que permite capturar errores entre otras ventajas.

Un ejemplo sencillo para resolver el problema anterior con esta librería sería algo así:

...

<script src="js/vendor/q.js"></script>

</head>

<body>

<script>

function primeraFuncion() {

var deferred = Q.defer();

setTimeout(function() {

alert('Primera funcion');

deferred.resolve();

}, 2000);

return deferred.promise;

}

function segundaFuncion() {

var deferred = Q.defer();

setTimeout(function() {

alert('Segunda funcion');

deferred.resolve();

}, 1000);

return deferred.promise;

}

Q()

.then(primeraFuncion)

.then(segundaFuncion)

.done();

</script>

Si ejecutamos esa cadena de promesas, veremos que ahora la segunda función se espera a que la primera termine, pero, ¿qué ha pasado exactamente ahí?

Primero hemos cargado la librería y  luego en cada una de las funciones hemos creado un objeto mediante Q.defer(), que consta de varios métodos, de los cuales me interesa destacar ahora dos:

  • resolve(): que sirve para indicar que el proceso ha concluido correctamente;
  • y reject(): que sirve justo para lo contrario, cuando algo ha salido mal.

Por último, en las funciones hemos devuelto una promise, que recoge el estado de la operación, por decirlo de una manera un tanto burda.

A continuación, viene la «cadena de promesas» concatenadas en su definición con then() y ejecutadas con done(). ¿Sencillo, no?

|| Tags: ,

valoración de los lectores sobre Introducción a las promises de Q.js

  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración positiva
  • 4.7 sobre 5 (6 votos)

¿Te ha parecido útil o interesante esta entrada?
dormido, valoración 1 nadapensativo, valoración 2 un poco sonrisa, valoración 3 a medias guiño, valoración 4 bastante aplauso, valoración 5 mucho

Tú opinión es muy importante, gracias por compartirla!

Los comentarios están cerrados.