/* * Es ist notwendig, einen EventEmitter zu implementieren. * Mit den Methoden emit und on. * * on(eventName: string | Symbol, callback: (payload?: any) => void): * () => void; * Nimmt einen eventName mit dem Namen des Ereignisses und eine Callback-Funktion. * Die Funktion registriert den Listener für das Ereignis. * Das Ergebnis der Funktion sollte eine Abmeldefunktion sein. * * emit(eventName: string | Symbol, payload?: any): void * Nimmt einen eventName mit dem Namen des Ereignisses und einen Payload, * der an jeden Listener des Ereignisses übergeben wird; die Funktion löst das Ereignis aus. * Wenn kein Listener gefunden wird, sollte eine Ausnahme geworfen werden. * * ------------------------------------------------------ * * Beispiel: * const myEmitter = new EventEmitter(); * * const unSubscribe = myEmitter.on('event', (payload) => { * console.log('Ein Ereignis ist eingetreten!!!', payload); */
sobes.tech KI
Antwort von AI
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` вызывает все слушатели события, если они есть, иначе выбрасывает ошибку.