Назад к вопросам
Middle+
2
function createEmitter() { const events = new Map(); function on(event, handler) { if(!events.has(event)) { events.set(event, [handler]) return } events.get(event).push(handler) } function off(event, handler) { // TODO: удалить handler } function emit(event, payload) { // TODO: вызвать всех подписчиков event } return { on, off, emit }; } const bus = createEmitter(); const unsub1 = bus.on("order:created", (payload) => { console.log("handler1:", payload.id); }); const handler2 = (payload) => { console.log("handler2:", payload.id); } bus.on("order:created", handler2);
Компании, где спрашивали
Basis
Ответ от нейросети
sobes.tech AI
Чтобы реализовать методы off и emit в вашем эмиттере событий, нужно:
- В
off(event, handler)удалить конкретный обработчик из массива обработчиков для события. - В
emit(event, payload)вызвать все обработчики, подписанные на событие, передавая им полезную нагрузку.
Пример реализации:
function createEmitter() {
const events = new Map();
function on(event, handler) {
if (!events.has(event)) {
events.set(event, [handler]);
return;
}
events.get(event).push(handler);
}
function off(event, handler) {
if (!events.has(event)) return;
const handlers = events.get(event);
const index = handlers.indexOf(handler);
if (index !== -1) {
handlers.splice(index, 1);
}
if (handlers.length === 0) {
events.delete(event);
}
}
function emit(event, payload) {
if (!events.has(event)) return;
// Создаем копию массива, чтобы избежать проблем, если обработчики будут удаляться во время вызова
const handlers = [...events.get(event)];
handlers.forEach(handler => {
try {
handler(payload);
} catch (e) {
console.error(`Ошибка в обработчике события '${event}':`, e);
}
});
}
return { on, off, emit };
}
// Использование:
const bus = createEmitter();
const handler1 = (payload) => {
console.log("handler1:", payload.id);
};
bus.on("order:created", handler1);
const handler2 = (payload) => {
console.log("handler2:", payload.id);
};
bus.on("order:created", handler2);
bus.emit("order:created", { id: 123 });
bus.off("order:created", handler1);
bus.emit("order:created", { id: 456 });