on, off, once ve emit metotlarına sahip bir EventEmitter sınıfı yazın.
Cevap
EventEmitter, olay adına göre dinleyici listesi tutan bir pub/sub yapısıdır. Map<string, Set<Function>> iyi bir veri yapısıdır.
class EventEmitter {
#events = new Map();
on(name, listener) {
if (!this.#events.has(name)) this.#events.set(name, new Set());
this.#events.get(name).add(listener);
return () => this.off(name, listener); // unsubscribe fonksiyonu
}
off(name, listener) {
this.#events.get(name)?.delete(listener);
}
once(name, listener) {
const wrapper = (...args) => {
this.off(name, wrapper);
listener.apply(this, args);
};
return this.on(name, wrapper);
}
emit(name, ...args) {
const listeners = this.#events.get(name);
if (!listeners) return false;
// Kopya üzerinde dön: emit sırasında off/once listeyi değiştirebilir
[...listeners].forEach((fn) => fn.apply(this, args));
return true;
}
}
const bus = new EventEmitter();
const unsub = bus.on("login", (user) => console.log("Hoş geldin", user));
bus.once("login", () => console.log("İlk giriş"));
bus.emit("login", "Ayşe"); // Hoş geldin Ayşe, İlk giriş
bus.emit("login", "Ayşe"); // Hoş geldin Ayşe
unsub();Tartışılacak noktalar
Setaynı fonksiyonun iki kez eklenmesini engeller; Node.js'teki EventEmitter ise diziyle tutar ve aynı fonksiyonu tekrar ekleyebilir. Hangisini istediğinizi belirtin.- Bir dinleyici hata fırlatırsa diğerleri çalışmalı mı? Gerekirse
try/catch. - Bellek sızıntısı: unsubscribe edilmeyen dinleyiciler (React'te
useEffectcleanup'ında çağırın).
İlgili JavaScript soruları
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.