Eventos
O node.js é perfeito para desenvolver aplicações orientadas a eventos.
Muitos objetos em node.js emitem eventos, por exemplo, net.Server emite um evento toda vez que um ponto se conecta a ele, o objeto fs.readStream emite um evento quando um ficheiro é aberto. Todos os objetos que emitem eventos são instâncias de events.EventEmitter.
Exemplo:
const fs = require('fs');
var readStream = fs.createReadStream('./file.txt');
readStream.on('open', function () {
console.log('O ficheiro está aberto');
});
readStream.on('error', function () {
console.log('O ficheiro não existe');
});
Neste exemplo, usamos o método createReadStream() do objeto fs para abrir um ficheiro.
Este método emite dois eventos : open e error se abrir o ficheiro ou se este não existir, respetivamente.
Tratamos os dois eventos com o método on que recebe dois argumentos: uma string que identifica o evento e uma função de callback que é executada pelo node.js quando o evento ocorrer.
O módulo events
Podemos criar os nossos próprios eventos usando o módulo events. Para isso fazemos:
let events = require('events');
O módulo events possui uma classe, EventEmitter, a partir da qual podemos criar um objeto que possui um conjunto de métodos e propriedades que nos permitem, por exemplo, capturar eventos e/ou emitir eventos.
Para podermos tratar os nossos próprios eventos, começamos por instanciar um objeto da classe EventEmitter:
var events = require('events');
var eventEmitter = new events.EventEmitter();
Depois, podemos usar os métodos on e emit para capturar um evento ou emitir um evento, respetivamente:
var events = require('events');
var eventEmitter = new events.EventEmitter();
//Captura o evento ‘grito’ e trata o evento:
eventEmitter.on('grito', function(){
console.log("Ouvi um grito");
});
//Dispara o evento ‘grito’:
eventEmitter.emit('grito');
Emitir evento com argumentos
Passo 1: Importar o módulo events e criar um EventEmitter
const EventEmitter = require('events');
const meuEmitter = new EventEmitter();
Passo 2: Registrar um listener para o evento, definindo os parâmetros esperados
meuEmitter.on('meuEvento', (param1, param2) => {
console.log(`Evento recebido com parâmetros: ${param1} e ${param2}`);
});
Passo 3: Emitir o evento passando os parâmetros
meuEmitter.emit('meuEvento', 'Olá', 2025);
Na consola, aparecerá a mensagem:
textEvento recebido com parâmetros: Olá e 2025
Explicação
EventEmitteré uma classe do Node.js que permite criar emissores de eventos.on('meuEvento', callback)registra um “listener” que será chamado quando o eventomeuEventofor emitido.emit('meuEvento', arg1, arg2, ...)dispara o evento e passa os argumentos para os listeners.- Os parâmetros passados em
emitsão recebidos pelo callback na mesma ordem.
Esse padrão é muito usado para comunicação interna entre módulos assíncronos em Node.js, com múltiplos listeners podendo responder aos mesmos eventos, cada um recebendo os parâmetros emitidos.
Exemplo completo:
const EventEmitter = require('events');
const meuEmitter = new EventEmitter();
meuEmitter.on('meuEvento', (param1, param2) => {
console.log(`Evento recebido com parâmetros: ${param1} e ${param2}`);
});
meuEmitter.emit('meuEvento', 'Olá', 2025);
