Sobes.tech
Назад к вопросам
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 });