Sobes.tech
Middle+

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: remove handler } function emit(event, payload) { // TODO: call all subscribers of 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);

sobes.tech AI

Answer from AI

To implement the off and emit methods in your event emitter, you need to:

  • In off(event, handler), remove the specific handler from the array of handlers for the event.
  • In emit(event, payload), call all handlers subscribed to the event, passing them the payload.

Example implementation:

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;
    // Create a copy of the array to avoid issues if handlers are removed during invocation
    const handlers = [...events.get(event)];
    handlers.forEach(handler => {
      try {
        handler(payload);
      } catch (e) {
        console.error(`Error in event handler '${event}':`, e);
      }
    });
  }

  return { on, off, emit };
}

// Usage:
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 });
function createEmitter() { const events = new Map()… - sobes.tech