EventEmitter: Pemrograman Berbasis Event

Membangun objek yang memancarkan dan mendengarkan event dengan modul events, fondasi hampir semua modul Node.

Part 10 dari 24 ± 35 menit Gratis

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

MetodeFungsi
on(nama, fn) / addListenerDaftarkan pendengar
once(nama, fn)Pendengar yang jalan sekali saja
off(nama, fn) / removeListenerLepas 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.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X