EventEmitter: Pemrograman Berbasis Event
Membangun objek yang memancarkan dan mendengarkan event dengan modul events, fondasi hampir semua modul Node.
Konsep: pemancar dan pendengar
Banyak hal di Node berbentuk "kalau X terjadi, lakukan Y": server menerima permintaan, file selesai dibaca, koneksi terputus. Pola ini disebut event. Modul events menyediakan kelas EventEmitter: objek yang bisa memancarkan (emit) event bernama dan memiliki pendengar (on) untuk event itu. Server HTTP, stream, dan process semuanya adalah EventEmitter.
const EventEmitter = require('events');
const radio = new EventEmitter();
radio.on('lagu', (judul) => console.log('Memutar:', judul));
radio.on('lagu', (judul) => console.log('Mencatat ke log:', judul));
radio.emit('lagu', 'Bintang Kecil');
// Memutar: Bintang Kecil
// Mencatat ke log: Bintang Kecil
Satu event boleh punya banyak pendengar; mereka dipanggil sinkron, berurutan sesuai pendaftaran.
Metode penting
| Metode | Fungsi |
|---|---|
on(nama, fn) / addListener | Daftarkan pendengar |
once(nama, fn) | Pendengar yang jalan sekali saja |
off(nama, fn) / removeListener | Lepas pendengar |
emit(nama, ...args) | Pancarkan event; mengembalikan true bila ada pendengar |
listenerCount(nama) | Jumlah pendengar |
removeAllListeners(nama) | Lepas semua |
Membuat kelas sendiri yang memancarkan event
const EventEmitter = require('events');
class Pesanan extends EventEmitter {
constructor(id) {
super();
this.id = id;
}
bayar(total) {
// ...proses pembayaran...
this.emit('dibayar', { id: this.id, total });
}
}
const p = new Pesanan('INV-001');
p.on('dibayar', ({ id, total }) => console.log(`Pesanan ${id} lunas: Rp${total}`));
p.bayar(50000);
Pola ini memisahkan apa yang terjadi dari siapa yang peduli. Pesanan tidak perlu tahu bahwa ada modul email, stok, dan analitik yang bereaksi — mereka cukup mendengarkan.
Event "error" itu istimewa
Jika kamu emit('error', err) dan tidak ada pendengar 'error', Node melempar error itu dan proses bisa mati. Selalu pasang pendengar error pada emitter yang bisa gagal:
emitter.on('error', (err) => console.error('Gagal:', err.message));
once sebagai Promise
const { once } = require('events');
const [hasil] = await once(emitter, 'selesai'); // menunggu event berikutnya
Peringatan kebocoran memori
Menambah pendengar terus-menerus (mis. di dalam loop) tanpa melepasnya memicu peringatan MaxListenersExceededWarning setelah 10 pendengar pada satu event dan dapat membocorkan memori. Lepas pendengar yang tak lagi diperlukan dengan off.
Argumen dan this
Pada fungsi biasa, this di dalam pendengar adalah emitter-nya; pada arrow function tidak. Argumen emit diteruskan apa adanya ke pendengar.