node (5): eventos

Introducción a los eventos de node

Joseph Stella

archivado en: JavaScript / 26 agosto, 2016 / taller:

Hace algo más de un año comencé una serie sobre Node, pero tuve que dejarla a la cuarta entrada por razones que no vienen al caso. Retomo ahora el tema, aunque cambiaré un poco el orden previsto entonces.

Como ya expliqué, una de las características más importantes de node es que permite trabajar de forma no bloqueante, no se espera a terminar una tarea para comenzar la siguiente, sino que las va lanzando de forma asíncrona a medida que se van solicitando, a medida que se disparan eventos, término este último que debemos entender de manera más amplia que los eventos disparados por la acción de un usuario en una web. Por ejemplo, cuando un cliente se conecta a un sitio o cuando se termina de leer un fichero se disparan eventos.

El mecanismo básico es muy sencillo:

/* Importamos el módulo */

const events = require('events');

/* Definimos un objeto */

var myEventEmitter = new events.EventEmitter();

/* Y ya podemos manejar eventos */

myEventEmitter.on('miEvento', function() {

console.log('Hey, se ha lanzado miEvento');

});

myEventEmitter.emit('miEvento');

Hay formas más complejas de instanciar el objeto aprovechando las nuevas clases de ecma6, pero con la expuesta nos vale.

Los métodos más importantes son los que hemos visto en el ejemplo anterior:

emit('nombreEvento', arg1, arg2, argn): para emitir un evento.

on('nombreEvento', function(arg1, arg2, arg){}): para escucharlo. Este método es exactamente igual que la fórmula más verbosa de addListener.

myEventEmitter.addListener('miEvento', function() {

console.log('Hey, se ha lanzado miEvento');

});

Ojo, el uso de funciones arrow, ()=>, hacen que se pierda la referencia al this de la instancia.

Se pueden definir varios listeners para el mismo evento:

myEventEmitter.on('miEvento', function() {

console.log('Hey, se ha lanzado miEvento');

});

myEventEmitter.on('miEvento', function() {

console.log('Yo hago otra cosa');

});

El límite natural son 10 listeners por evento, luego node lanzaría un warning ya que puede ocurrir un problema de rendimiento (memory leak); pero vamos, que mal tiene que estar organizado el código para necesitar tanto listener separado y, en esos casos, se puede cambiar el límite (desaconsejado) con el método setMaxListeners().

Otros métodos importantes son:

once(): remueve la escucha la primera vez que es activada.

myEventEmitter.once('miEvento', function() {

console.log('Hey, se ha lanzado miEvento');

});

myEventEmitter.emit('miEvento');

myEventEmitter.emit('miEvento'); // <--- este ya no es «escuchado».

removeListener('miEvento', listener): elimina un listener en concreto.

removeAllListeners(['miEvento']): elimina todos los listeners de un evento.

listeners(event): un array con todos los listeners asociados a un evento.

Bueno, me quedaría hablar de la comunicación de eventos entre módulos, pero lo dejo para otro día.

|| Tags: , ,

Este artículo aún no ha sido valorado.

¿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.