A blog about data, information and Tech by Mario Alberich

        

Javascript: Promises y eventos

Si has desarrollado una buena temporada con Javascript y has requerido de la gestión intensiva de eventos y callbacks, sabrás que es fácil que el flujo de ejecución de la aplicación sea muy difícil de seguir, incluso utilizando profusamente la consola de javascript del navegador y el debugging: salta de un lado a otro y no sabes de dónde viene.

Bienvenido al callback hell.  éste es el escenario en el que una caracerística a priori ventajosa del lenguaje de programación (programación asíncrona de javascript) se vuelve en contra. ¿Y ahora qué?

Javascript y las promesas


Para intentar sincronizar las operaciones asíncronas, se introdujo el concepto de promises.  En palabras llanas es una forma de evitar que la finalización impredecible de los eventos interfiera en el flujo general de la aplicación, consiguiendo un cierto nivel de sincronización que se pierde con los eventos y callbacks. Esto salva la aplicación del callback hell. Vittorio Zaccaria presentó un ejemplo visual para entender las promises de javascript utilizando las redes de Petri.

Pero hay más: aparte de la simplificación que supone la agregación de callbacks en un solo promise, existe un motivo más profundo que no hay que perder de vista: al utilizar las promesas, podemos lanzar excepciones desde las funciones llamadas y esperar que la promesa los capture. Y eso sí marca la diferencia, porque permite recuperar el control sobre los errores. Al recuperar ese control, podemos testear y depurar las aplicaciones con más facilidad.

En el fondo las promesas permiten combinar lo mejor de ambos mundos:

  • Comportamiento asíncrono para aprovechar al máximo la CPU y evitar el bloqueo de operaciones I/O.
  • Comportamiento síncrono sobre el control general del flujo de ejecución, y posibilidad de captura de excepciones.


Como nota al margen: parece ser que jQuery implementó las promesas con un criterio diferente al de CommonJS, y no se plantea modificarlo. Bajo su criterio serán sustituidos por los DOM Futures que son aparentemente mejores (yo no sabría valorarlo ahora mismo), y por ello prefieren mantener la compatibilidad de versiones anteriores. Por ello, si usas las promesas de jQuery, es importante que sepas que su funcionamiento es diferente.

© 2007 and beyond Mario Alberich, licensed under CC-BY-SA unless stated otherwise.