EventEmitter на JavaScript
Реализовал простенький EventEmitter через классы, однако почему-то реализация методов off и once не проходят автотесты. Подскажите, в чем может быть проблема?
class EventEmitter {
constructor() {
this.events = {};
}
on(eventName, callback) {
this.events[eventName] = this.events[eventName] || [];
this.events[eventName].push(callback);
return this;
}
off(eventName, callback) {
let event = this.events[eventName];
if (!event) return this;
for (let i = event.length; i > 0; i--) {
if (event[i] === callback) {
event.splice(i, 1);
break;
}
}
return this;
}
once(eventName, callback) {
this.events[eventName] = this.events[eventName] || [];
const onceEvent = () => {
callback();
this.off(eventName, onceEvent);
}
this.events[eventName].push(onceEvent);
return this;
}
emit(eventName, ...args) {
let fns = this.events[eventName];
if (!fns) return false;
fns.forEach((fn) => {
fn.call(null, args);
});
return true;
}
}
Также необходимо расширить класс EventEmitter классом BroadcastEventEmitter так, чтобы была возможность вызвать все обработчики всех событий.
emit("*", [...arg])
Ответы (1 шт):
Автор решения: space boy
→ Ссылка
Как минимум стоит реализовать метод off по аналогии с on
off(eventName, callback) {
if (!this.events[eventName]) return 'no'
delete this.events[eventName];
return this.events;
}