Sobes.tech
Middle+

/* * Bir EventEmitter uygulaması gereklidir. * emit ve on metodları ile. * * on(eventName: string | Symbol, callback: (payload?: any) => void): * () => void; * Bir eventName ve callback fonksiyonu alır. * Bu fonksiyon, olaya abone olmayı sağlar. * Fonksiyonun sonucu, aboneliği iptal eden bir fonksiyon olmalıdır. * * emit(eventName: string | Symbol, payload?: any): void * Bir eventName ve payload alır; bu payload, her eventName dinleyicisine iletilir. * Bu fonksiyon, olayı tetikler. * Eğer dinleyici bulunamazsa, bir istisna atılmalıdır. * * ------------------------------------------------------ * * Örnek: * const myEmitter = new EventEmitter(); * * const unSubscribe = myEmitter.on('event', (payload) => { * console.log('bir olay gerçekleşti!!!', payload); */

sobes.tech yapay zeka

AI'dan gelen yanıt

typescript class EventEmitter { private events: Map<string | Symbol, Set<(payload?: any) => void>> = new Map();

on(eventName: string | Symbol, callback: (payload?: any) => void): () => void { if (!this.events.has(eventName)) { this.events.set(eventName, new Set()); } const listeners = this.events.get(eventName)!; listeners.add(callback);

// Возвращаем функцию отписки
return () => {
  listeners.delete(callback);
  if (listeners.size === 0) {
    this.events.delete(eventName);
  }
};

}

emit(eventName: string | Symbol, payload?: any): void { const listeners = this.events.get(eventName); if (!listeners || listeners.size === 0) { throw new Error(No listeners for event: ${String(eventName)}); } for (const listener of listeners) { listener(payload); } } }

// Пример использования: const myEmitter = new EventEmitter();

const unSubscribe = myEmitter.on('event', (payload) => { console.log('an event occurred!!!', payload); });

myEmitter.emit('event', { data: 123 });

unSubscribe();

// После отписки вызов emit выбросит ошибку // myEmitter.emit('event');


В этом решении:
- Используется `Map` для хранения множества слушателей по имени события.
- Метод `on` добавляет слушателя и возвращает функцию отписки.
- Метод `emit` вызывает все слушатели события, если они есть, иначе выбрасывает ошибку.