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 });