Tras nuestro repaso de algunas características que nos serían útiles de JavaScript, vamos a ver algunas propiedades, métodos o lógicas de NodeJS que nos ayudarán con el desarrollo de servicios en este lenguaje.
Event Loop
Node usa un solo hilo, o más bien como concepto de ciclo de vida para nosotros es así, es posible que internamente se ejecute de otra forma pero insisto no para nosotros.
Este hilo funciona como un bucle, es decir, lo que hace en cada vuelta es ejecutar el código que le toca en ese momento(todo síncrono), y si se encuentra algún callback lo ejecuta pero, repito pero los va dejando pendientes y comprueba si han terminado en vueltas posteriores y si han terminado entonces ejecúta sus el código pertinente a ese callback.
Por este motivo todo el nuestro código en NodeJS tenemos que procurar que sea no bloqueante, si puede bloquear de algúna forma el hilo eso significa que tenemos que hacerlo asíncrono para que el event loop(nuestro único hilo) no se detenga. Todas las llamadas a funciones de entrada/salida lectura/escritura del disco, red, base de datos deberia ser asíncrono.
Process
Process es un objeto global que está disponible en nuestras aplicaciones, el cual nos va a permitir por ejemplo:
saber en que sistema operativo está funcionando,
process.platform;
parar la ejecución con un código de salida,
process.exit(int); //0 para salida correcta
responder a eventos como este de 'exit' con un callback para hacer algo antes de parar la ejecución
process.on('exit',callback);
o hacer algo en la siguiente vuelta del event loop
process.nextTick(function(){
console.log('Siguiente vueltaaaaaaaaaa')
}
Ejemplo de información de sistema
'use strict';
var systemInfo = {
pid: process.pid,
version: process.version,
platform: process.platform,
title: process.title,
arg: process.argv,
execPath: process.execPath,
folder: process.cwd()
};
console.log('Id de proceso ' + systemInfo.pid)
console.log('Versión de Node' + systemInfo.version)
console.log('Plataforma ' + systemInfo.platform)
console.log('Nombre de proceso ' + systemInfo.title)
console.log('Argumentos que recibe ' + systemInfo.arg)
console.log('Path de ejecución de proceso '+ systemInfo.execPath)
console.log('Path de ejecución de aplicación de node '+ systemInfo.folder)
Con este código vereis varios ejemplos de información que podemos sacar gracias a process.
Veamos ahora un ejemplo de exit, para ello vamos poner antes de todos los logs lo siguiente
process.exit(2);
Si ahora ejecutais vereis como se finaliza el programa antes de mostrar nada y podéis comprobar el código de salida con
En linux/Mac:
echo $?
En Windows:
echo %errorlevel%
Por último vamos a probar a realizar algo justo antes de salir para ello, vamos a dejar nuestro código asi:
'use strict';
var systemInfo = {
pid: process.pid,
version: process.version,
platform: process.platform,
title: process.title,
arg: process.argv,
execPath: process.execPath,
folder: process.cwd()
};
process.on('exit', () => { console.log('Antes de salir digo BYEEEEEe')})
console.log('Id de proceso ' + systemInfo.pid)
console.log('Versión de Node' + systemInfo.version)
console.log('Plataforma ' + systemInfo.platform)
process.exit(0);
console.log('Nombre de proceso ' + systemInfo.title)
console.log('Argumentos que recibe ' + systemInfo.arg)
console.log('Path de ejecución de proceso '+ systemInfo.execPath)
console.log('Path de ejecución de aplicación de node '+ systemInfo.folder)
Si ahora ejecutamos esto veréis algo similar a esto
Como veis nos muestra los tres primeros logs y en cuanto llega al exit se despide y ya no nos muestra más, sencillo verdad?
EventEmitter
Este método puede ser una herramienta muy útil para según que cosa, lo que nos permite es asignar una o varias funciones a un evento, es decir, cada vez que llamemos a ese evento se ejecutará su función asignada.
Veamoslo con un ejemplo, antes de nada vamos a importar lo que necesitamos para usarlo:
'use strict';
var events = require('events');
var eventEmitter = new events.EventEmitter();
Ya estamos listos, ahora pensemos en cualquier juego de Mario Bros.. Cada vez que nuestro Mario hacia algún tipo de evento distinto a moverse izquierda o derecha emitía un sonido, ya fuera saltar, coger alguna moneda o saltar sobre alguna inocente tortuga, es decir, a nivel de código tiene que tener un método similar a playSound no? Pues vamos a crearlo
function playSound(){
console.log("Mario hace algo");
}
Ya tenemos nuestro método, ahora como hemos comentado esto tiene que responder a algún evento, por lo que vamos a asignarle un nombre de evento a ese método
eventEmitter.on('play music',playSound);
Para llamar a ese evento que hemos creado es tan simple como emitirlo
eventEmitter.emit('play music');
Asi de simple jejejejeje pero esto realmente si lo pensamos es poco eficiente, con este tendriamos que crear realmente un evento por cada tipo desonido, no?......Pues no realmente, también nos permite pasarle parámetros, vamos a cambiar nuestro método para que reciba un parámetro donde indicariamos el tipo de sonido
function playSound(action){
console.log("Mario ",action);
}
Y hagamos que nuestro emit le pase algún parámetro
eventEmitter.emit('play music','coge moneda');
Y voilá si ejecutámos veremos que Mario ha cogido una moneda
Comentar que podemos suscribir varias funciones al mismo evento, simplemente tendriamos que hacer otro eventEmitter.on con el mismo nombre de evento y otro nombre de función, esto lo que haría seria ejecutar ambos.
Y es en este punto donde por ejemplo podemos ver mejor su utilidad, si seguimos usando nuestro ejemplo de Mario, supongamos el momento en el que Mario salta sobre una tortuga, esto tendría que gestionar entre otras cosas el sonido al pisar la tortuga, el efecto visual de la tortuga y si esto nos da puntos tendríamos que efectuar la gestión de estos. Son bastantes cosas no?....pero si tenemos todas estas necesidades subscritas al mismo evento, por ejemplo turtleDeath solo tendriamos que hacer
eventEmitter.emit('turtleDeath')
Y listo se ejecutarian todos los eventos y el código quedaría bastante limpio.
Creo que más o menos queda todo claro, en el próximo post hablaremos de los módulos de Node y de como crearlos.
Un abrazooorrrrr



