Curso de




Día 5: Eventos

Vuestro anfitrión


(según mi hija de 5 años)

Ingeniero senior en MediaSmart Mobile
Co-organizador de Node.js Madrid
@pinchito

Guión


  • Eventos
  • Sesión práctica: emisor de eventos

Eventos

Asincronía al poder

Emisor de eventos


Clase EventEmitter


Emite evento data:

emitter.emit('data', data);


Para recibir el evento data:

emitter.on('data', function(data) {
console.log('Data: %s', data);
});

API de recepción


emitter.on(event, function(data) {}); 

Registra un listener para un evento

emitter.once(event, function(data) {}); 

Registra un listener para una sola vez

emitter.removeListener(event, listener); 

Elimina un listener

emitter.removeAllListeners([event]); 
Elimina todos los listeners, opcionalmente para un evento

La temible fuga de memoria


(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.

Ocurre cuando se añaden listeners a un emisor

y no se eliminan


Ejemplo: reutilización de conexiones en un servidor


Solución: al terminar cada petición eliminar listener

emitter.removeListener('event', listener);

Emitiendo Eventos

Podemos crear nuestros propios EventEmitters:

var events = require('events');
var util = require('util');
function MyEmitter() {
    events.EventEmitter.call(this);
    http.createServer(function (request, response) {
        this.emit('request', request);
        res.end('Hello World\n');
    }).listen(1337, '127.0.0.1', function() {
        this.emit('init');
    });
}
util.inherits(LimitsUpdater, events.EventEmitter);
var emitter = new MyEmitter();
emitter.on('init', function() {
    console.log('Server started');
});
Esto nos permite gestionar eventos en lugar de callbacks

Sesión práctica 3: hola, mundo (again)


Servidor de sockets


Control a bajo nivel de la conexión


Recibe datos, envía respuesta


Manejado con eventos

Hola, mundo (sockets)


var net = require('net');
var port = 1702;
var server = net.createServer(function(connection) {
    console.log('Connection open');
    connection.write('Hello?\r\n');
    connection.on('data', function(data) {
        if (String(data).trim() != 'hello') {
            connection.write('ERROR\r\n');
        } else {
            connection.end('world\r\n');
            console.log('connection closed');
        }
    });
});
server.listen(port);

Contiene tres niveles de ejecución

Ejercicios



Manejar los eventos error y end

Logar un error o un mensaje normal



Convertir a EventEmitter

¡Buen trabajo!

Thanks!