Live Coding: Реализуй базовый механизм EventEmitter с методами subscribe, publish и механизмом отписки
Ответ от нейросети
sobes.tech AI
javascript class EventEmitter { constructor() { this.events = new Map(); }
subscribe(eventName, callback) { if (!this.events.has(eventName)) { this.events.set(eventName, new Set()); } const subscribers = this.events.get(eventName); subscribers.add(callback);
// Возвращаем функцию отписки
return () => {
subscribers.delete(callback);
if (subscribers.size === 0) {
this.events.delete(eventName);
}
};
}
publish(eventName, data) {
if (!this.events.has(eventName)) return;
for (const callback of this.events.get(eventName)) {
try {
callback(data);
} catch (e) {
// Обработка ошибок в коллбэках, чтобы не прерывать рассылку
console.error(Error in subscriber callback for event '${eventName}':, e);
}
}
}
}
// Пример использования: const emitter = new EventEmitter(); const unsubscribe = emitter.subscribe('message', (data) => { console.log('Получено сообщение:', data); }); emitter.publish('message', 'Привет!'); unsubscribe(); emitter.publish('message', 'Это сообщение не будет обработано');