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

  • Set aynı 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 useEffect cleanup'ında çağırın).
  1. var, let ve const arasındaki fark nedir?KolayJavaScriptFrontend
  2. == ile === arasındaki fark nedir?KolayJavaScriptFrontend
  3. Closure nedir? Bir örnekle açıklayın.OrtaJavaScriptFrontend
  4. Aşağıdaki kodun çıktısı nedir? (Event loop)OrtaJavaScriptFrontend
  5. this anahtar kelimesi nasıl belirlenir? Arrow function'larda ne değişir?OrtaJavaScriptFrontend
  6. Bir debounce fonksiyonu yazın.ZorJavaScriptFrontend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle