Event emitter

Se você já trabalhou com JavaScript no browser, já sabe o quão grande é a quantidade de ações do usuário que são tratadas por eventos: clicks do mouse, teclas sendo pressionadas, movimentos do mouse, e muito mais.

No lado do backend, o Node.js nos oferece a opção de trabalhar com um sitema similar usando o módulo events.

Esse módulo, em particular, fornece a classe EventEmitter, que nós utilizaremos para lidar com nossos eventos.

Você a inicializa usando

const EventEmitter = require('events')
const eventEmitter = new EventEmitter()

Esse objeto expõe, entre muitos outros, os métodos on e emit.

  • emit é usado para acionar um evento
  • on é usado para adicionar uma função callback que será executada quando o evento for acionado

Por exemplo, vamos criar um evento start, e para dar uma amostra grátis, vamos reagir a ele logando no console:

eventEmitter.on('start', () => {
console.log('started')
})

Quando rodamos

eventEmitter.emit('start')

a função que lida com o evento é acionada, e obtemos o log.

Você pode passar argumentos à função passando-os como argumentos adicionais do emit():

eventEmitter.on('start', number => {
console.log(`started ${number}`)
})
eventEmitter.emit('start', 23)

Múltipos argumentos:

eventEmitter.on('start', (start, end) => {
console.log(`started from ${start} to ${end}`)
})
eventEmitter.emit('start', 1, 100)

O objeto EventEmitter também expõe diversos outros métodos que interagem com eventos, como

  • once(): escuta o evento apenas uma vez
  • removeListener() / off(): remove um escutador (listener) de um evento
  • removeAllListeners(): remove todos escutadores (listeners) de um evento

Você pode ler o detalhe de todos eles na página do módulo events em https://nodejs.org/api/events.html