AULA 30 MÓDULO 3 orientação a eventos ⏱ 45 min

EventEmitter no Node.js

A classe EventEmitter do Node. on, once, emit, off. Herdar EventEmitter em classes de domínio. Memory leaks e como evitar.

EventEmitterononceemitoffmemory leak

EventEmitter

Node.js tem a classe EventEmitter embutida que é a base do sistema de eventos. A maioria dos módulos nativos (fs, http, stream) herdam de EventEmitter.

🔌
on vs once
emitter.on(evento, fn) — ouve infinitas vezes. emitter.once(evento, fn) — ouve apenas uma vez e remove o listener. Use once para eventos de inicialização, on para eventos recorrentes.

Herdando EventEmitter

O padrão correto em Node.js é criar classes que herdam de EventEmitter para adicionar comportamento orientado a eventos a domínios do sistema.

⚠️
memory leak
Adicionar listeners em loops sem remover é a causa #1 de memory leaks em Node. Use emitter.removeListener() ou emitter.off(), ou prefira once() quando o listener é de uso único.
javascript
// EventEmitter básico
const { EventEmitter } = require('events')
const emitter = new EventEmitter()

// Registrar listener
emitter.on('user.created', (user) => {
  console.log('Enviar email para:', user.email)
})

emitter.on('user.created', (user) => {
  console.log('Registrar no analytics:', user.id)
})

// Emitir evento
emitter.emit('user.created', { id: 1, email: 'ana@ex.com' })
// Ambos os listeners disparam

// Herdar EventEmitter — padrão para domínios
class OrderService extends EventEmitter {
  async create(data) {
    const order = await db.orders.create(data)
    this.emit('order.created', order) // notifica sem saber quem ouve
    return order
  }
}
quiz · aula 30
Teste seus conhecimentos
0/3 respondidas
QUESTÃO 01
Qual a diferença entre on() e once()?
QUESTÃO 02
Por que adicionar listeners em loops pode causar memory leak?
QUESTÃO 03
O que acontece quando emitter.emit('order.created') é chamado?
0/3