Cargando



Trabajo asincrónico con CoffeeScript

En este tutorial veremos cómo podemos trabajar de forma asíncrona desde nuestras aplicaciones utilizando CoffeeScript como lenguaje, y así entender un poco más este mundo tan interesante y útil.


mar 13 2015 02:30
Profesional
mar 13 2015 09:16
Las operaciones asíncronas son parte importante de la lógica moderna de programación, ya que nos permite establecer procesos que no dependen uno del otro para que se ejecuten de forma “simultanea”, decimos esto así ya que muchas veces no se ejecutan en paralelo pero se van ejecutando cuando un proceso está bloqueado esperando una respuesta. En muchos casos esto sucede en milésimas de segundo dando esa sensación de que todo sucede al mismo tiempo.

La revolución de JavaScript ha hecho que el procesamiento de instrucciones asíncronas sea muy popular en la actualidad, con herramientas como Node.js que nos da la posibilidad de ejecutar instrucciones de esta manera cuando en otros servidores de otras tecnologías son procesos meramente sincrónicos.

¿Qué son las operaciones asíncronas?


El concepto detrás de todo esto es muy simple, son operaciones que no bloquean el uso o el acceso al hilo de procesamiento mientras se ejecutan, este concepto está muy relacionado a lo que estuvimos explicando al inicio del tutorial, cuando el proceso entra en espera y libera algunos ciclos del procesador, este en vez de esperar al proceso va tomando otras tareas que están en la cola, y así va satisfaciendo cada una de las peticiones que tiene.

Esto es realmente útil porque damos una sensación de tiempo real al usuario, pero además porque aprovechamos mejor los tiempos de espera de los procesos que se van ejecutando, sacando el máximo provecho al procesador.

¿Si las operaciones asíncronas son tan útiles por qué no se utilizan siempre?


En este momento después de leer la explicación anterior que suena tan optimista deben estar preguntándose esto mismo, la respuesta es muy simple este tipo de implementación añade un nivel superior de complejidad al momento de poder desarrollar los diferentes algoritmos y flujos de nuestros programas.

Nos encontraremos en situaciones donde debemos desarrollar lógicas más complejas y completas que le digan a los procesos que deben esperar, como deben ejecutarse, etc. Esto hace que no todas las aplicaciones requieran este tipo de manejo de procesos. Sin embargo, cuando ya estamos trabajando con Node.js o con JavaScript en general no es una decisión que podamos tomar, en esos casos debemos manejar la asincronía de forma natural.

Requisitos para desarrollar el tutorial
En este tutorial colocaremos algunos ejemplos prácticos, por lo que vamos a requerir que tengamos instalado y configurado CoffeeScript en nuestro equipo, también debemos tener un editor de texto como Sublime o NotePad ++ que nos ayuden a ver nuestro código de forma resaltada. Por último debemos asegurarnos de tener permisos suficientes para escribir archivos y ejecutar CoffeeScript en nuestro ambiente, esto más que todo en ambientes Linux, sin embargo es bueno recordarlo para evitar problemas fuera de lo que es CoffeeScript.


Creando Sincronía en CoffeeScript


Como explicamos antes en JavaScript y por ende en CoffeeScript las operaciones son asíncronas, es por ello que muchas tareas que necesitamos que esperen por el resultado de otras debemos especificar por quien deben esperar.

callback
Cuando sucede lo último que mencionamos es cuando aparece la figura del callback, que no es más que decir a una operación que debe ejecutarse cuando otra finalice, el punto donde una operación finaliza y puede llamar a otra es el denominado callback.

Este concepto es muy sencillo una vez que lo entendemos pero es difícil de asimilar si siempre hemos trabajado en ambientes sincrónicos. Veamos el siguiente ejemplo de cómo invocar a una función en el callback de otra.

Digamos que tenemos un proceso para hornear un pastel, entonces manejaríamos tres funciones básicas:
hornearPastel()cortarPastel()hacerCrema()
Desde esta perspectiva de una acción del mundo real podemos notar que hay algo que podemos hacer al mismo tiempo que horneamos el pastel, y esto es hacer la crema del mismo, pero la otra acción solo la podemos ejecutar una vez que tengamos el pastel horneado que es cortarlo.

Entonces ya hemos definido que debe suceder y en qué orden, veamos entonces el código de CoffeeScript:
hornearPastel -> cortarPastel()hacerCrema()
Si compilamos nuestro archivo .coffee, se traduce en el código JavaScript que podemos ver en la siguiente imagen:


coffeescript-trabajo-asincronico.jpg



Vemos como lo que desarrollamos en CoffeeScript es mucho más simple, sin embargo al ver el resultado en JavaScript podemos notar un par de cosas, el callback no es más que una función anónima que se añade al método del que depende la función que queremos colocar en modo sincrónico.

Lo otro que notamos es que cuando dos funciones están al mismo nivel estas serán asíncronas por naturaleza, por lo que nuestro esfuerzo solo debe concentrarse en establecer las funciones que deben ser ejecutadas una tras otra.

Asincronía en HTTP


Uno de los lugares donde vemos más común el uso de la asincronía es en las peticiones HTTP, ya que aquí tenemos una muestra perfecta de cuando los procesos no depende de que otros se completen, por ejemplo cuando estamos cargando una web y necesitamos cargar varios recursos js estos se van cargando a medida que sus fuentes responden, y si hay algún recurso que no carga, esto no impide que los demás lo hagan.

Tomando esa misma filosofía se construyen también las API y los servicios web, es aquí donde desde nuestra aplicación entonces podemos hacer múltiples peticiones sin que una preceda a la otra, por supuesto siempre y cuando esté en acuerdo con nuestra lógica.

Alternativas en el manejo asíncrono


Si pensamos en grande, hay un punto en el cual vernos manejando un callback por cada proceso que dependa de otro suena como algo muy complejo de mantener, y aunque CoffeeScript ayuda a mantener una mejor legibilidad, no nos evitará que cuando tengamos miles de llamados todo sea menos difícil de depurar. Es aquí donde entran en juego diferentes librerías que nos ayudan a mantener la misma funcionalidad pero dándole un mejor aspecto y mayor facilidad a la hora de administrar nuestros procesos y funciones.

Promises
La primera solución que veremos es Promises, este enfoque es una forma de hacer las cosas de forma tal que en vez de retornar o llamar un callback, se llama una “promesa”, es decir, se invoca un Promise que nos llevará a tener la ejecución de una función o código posterior.

Como este comportamiento no es nativo generalmente se utiliza con dos librerías externas, la primera es reqwest.js que nos facilita el uso de peticiones HTTP a otros recursos, la cual podemos encontrar en el siguiente enlace.



La otra librería es rsvp.js que nos ayuda a manipular las Promises de forma más adecuada una vez que nuestra aplicación las ha generado, esta librería la podemos encontrar aquí.



Esto nos demuestra que una vez que conocemos el fundamento de la programación asíncrona nos podemos dar el lujo de implementar librerías que nos ayudan a mejorar nuestros procesos de codificación y así al final ahorrarnos horas de desarrollo.

IcedCoffeeScript


El trabajo con elementos asíncronos es tan importante en la actualidad que inclusive tenemos una variante de CoffeeScript que se concentra meramente en darnos más herramientas para manejar este tipo de programación.

IcedCoffeeScript debemos instalarlo a través de npm con el siguiente comando:
npm install iced-coffee-script
Se demorará unos segundos donde al final de su instalación debe mostrarnos lo siguiente por consola:


coffeescript-trabajo-asincronico-4.jpg



Esta herramienta nos permite utilizar una forma más amigable de darle el comportamiento a nuestras funciones, con las palabras clave await y defer. La primera consisten en que se está iniciando un bloque asíncrono, y defer indica que nuestra aplicación debe esperar que el bloque await termine su ejecución para continuar con la siguiente parte del programa.

Lo interesante no es ese comportamiento, ya que de alguna forma con el callback tenemos cierta similitud, si no que dentro de un bloque await nuestra aplicación se ejecuta de forma sincrónica, dándonos así un trasfondo más familiar a personas que vienen de lenguajes antiguos como PHP que va leyendo línea a línea las instrucciones que les damos.

CoffeeScript nos ayuda a entender estos conceptos debido a que su sintaxis es mucho más sencilla que la de JavaScript, y al generar la traducción a este último aprendemos también como se haría de la forma tradicional. Es importante leer la documentación oficial y hacer muchos ejemplos para tener todos estos conceptos claros y dominados, para de esta forma hacer mejores aplicaciones.

Con esto finalizamos este tutorial, como vemos el mundo de las nuevas tendencias de programación es muy interesante y tiene muchos conceptos nuevos que tal vez a quienes vengan de lenguajes anteriores no se les haga muy fácil entender, pero una vez que se entiende, seguramente nos diremos como hemos podido vivir sin ellos.

¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X