Creando un Workflow simple en Javascript con Promise

Posiblemente en varias ocasiones nos encontramos con el problema de que tenemos que esperar el resultado de varios métodos para luego tomar una acción posterior (Workflows) y esto en Javascript, nos puede traer algo de desconcierto, debido a su procesamiento asíncrono. Por eso, aunque a primera vista no es tan trivial conocer el momento exacto en el que una método ha finalizado, sobre todo si estos consumen servicios.

Una opción posible es utilizar llamadas callback en cada uno de nuestros métodos, para así lograr conocer cuando nuestro método ha finalizado, esto puede ser una opción válida si es que no se requiere anidar muchos métodos y con lógicas algo complejas, ya que si fuese este el escenario nuestro código comienza a ser poco amigable y confuso a la hora de comprender y mantener.

Bien, entonces creemos un ejemplo en el cual la implementación mediante callback no sea la más feliz y comparemos esto con una implementación con Promise.

Problema

Supongamos que tenemos que crear un Workflow de ejecución que consta de dos pasos, en el primero, se necesitan ejecutar dos métodos y una vez que ambos finalizan, podemos comenzar la ejecución del segundo paso del Workflow, el cual a su vez ejecutará tres métodos y cuando los mismos hallan finalizado, estaremos en condiciones de afirmar que el Workflow a finalizado.

Como dice el enunciado dentro de cada paso del Workflow los métodos se pueden ejecutar en paralelo ya que no depende uno de otro y en ningún momento nos lo impide.

Vamos a intentar resolver esto mediante la utilización de callback

En la siguiente implementación se crea una método llamado fn el cual representa las distintas funciones que se ejecutarán dentro de los pasos del Workflow, las mismas poseen un tiempo de ejecución aleatorio, para simular el tiempo de espera que solemos tener con los servicios.

Ejemplo:

Como podemos apreciar en este tipo de implementación podemos resaltar como aspectos poco eficientes o posibles puntos de mejora:

— Los métodos dentro de cada paso se ejecutan de forma secuencial, lo cual no era un requisito en el enunciado del problema a resolver y esto estaría provocando una penalización de tiempo innecesaria, ya que las mismas se podrían ejecutar en paralelo y esperar a sus respectivas finalizaciones para avanzar el paso del Workflow

— Nuestro código quedo poco elegante y un tanto confuso a la hora de mantener y comprender que se esta tratando de resolver, debido al anidamiento de callback’s.

— No tenemos un control de fallos, es decir que si esas funciones representan consultas a servicios, deberíamos controlar los posibles fallos en cada una de ellos y de alguna manera poco feliz, como puede ser un Flag buahhh !! perdón, para lograr detener las siguientes funciones del Workflow.

Resolvamos el mismo problema aplicando Promise

Antes de ir a ver la implementación de la solución al problema con Promise deberíamos repasar el concepto del mismo, para esto les dejo el siguiente link donde hay una descripción muy clara y detallada de que es, para que nos sirve y de como se usa:

Para nuestro ejemplo, vamos a utilizar la implementación de Promise de jQuery. Existen otras librerías como When.js que proporciona algunas funcionalidades más y mayor cantidad de operaciones por segundo que las que se logran con jQuery, esto para los más puntillosos.

Bien, ahora solo resta ver el ejemplo:

De la misma manera que en la implementación anterior se crea una método llamado fn el cual representa las distintas funciones que se ejecutarán dentro de los pasos del Workflow, las mismas poseen un tiempo de ejecución aleatorio, para simular el tiempo de espera que solemos tener con los servicios.

En este caso el código se hace más legible, mantenible y tenemos mayor control sobre lo que sucede en cada paso y con cada función de cada paso, pudiendo capturar errores, para así procesarlos y evitar de continuar con el Workflow, sin necesidad de recurrir a malos hábitos, sino que solo utilizando los métodos que nos proporciona.

Los tiempos de respuesta o ejecución serán mejores, debido que las funciones dentro de cada paso del Workflow se ejecutan en paralelo y el Promise, solo avanzará al siguiente paso una vez que todas han finalizado. Comparado con el ejemplo de callback, en el cual se ejecuta una función y recien cuando finaliza se continua con la siguiente, vemos que obtendremos los resultado con mayor velocidad.

Conclusión

No debemos abusar del uso Promise, sino que deberíamos contemplarlo en casos en los que amerita su implementación, como en este caso. Con lo cual no es un pecado utilizar callback’s, solo analizar el contexto para tomar la decisión adecuada.

Like what you read? Give Germán Peraferrer a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.