Observer / Event Emitter Pattern
JS · Common Patternssyntax
class EventEmitter { on(event, handler) {} emit(event, data) {} }example
class EventBus {
#handlers = new Map();
on(event, handler) {
if (!this.#handlers.has(event)) {
this.#handlers.set(event, new Set());
}
this.#handlers.get(event).add(handler);
return () => this.off(event, handler); // unsubscribe fn
}
off(event, handler) {
this.#handlers.get(event)?.delete(handler);
}
emit(event, data) {
this.#handlers.get(event)?.forEach(fn => fn(data));
}
}
const bus = new EventBus();
const unsub = bus.on("user:login", (user) => console.log(`Welcome, ${user}`));
bus.emit("user:login", "Ava"); // "Welcome, Ava"
unsub(); // unsubscribesNote The observer pattern decouples event producers from consumers. Returning an unsubscribe function from on() prevents memory leaks.