TGViewer
JavaScript JavaScript @javascript · 31.1K subscribers
Post #3447 2.26K
CHALLENGE

class EventBus {
#listeners = new Map();
on(event, fn) {
if (!this.#listeners.has(event)) this.#listeners.set(event, new Set());
this.#listeners.get(event).add(fn);
return () => this.#listeners.get(event).delete(fn);
}
emit(event, payload) {
this.#listeners.get(event)?.forEach(fn => fn(payload));
}
}
const bus = new EventBus();
const log = [];
const unsub = bus.on('data', v => log.push(`A:${v}`));
bus.on('data', v => log.push(`B:${v}`));
bus.emit('data', 1);
unsub();
bus.on('data', v => log.push(`C:${v}`));
bus.emit('data', 2);
console.log(log.join(','));
  • ❤ 2
  • 👍 1
More from @javascript
  1. Sep 20, 2026Post #3507
  2. Sep 20, 2026CHALLENGE 'use strict'; function getValue() { return this.value; } const obj = { value: 42…
  3. Sep 19, 2026Post #3505
  4. Sep 19, 2026CHALLENGE const a = 5 & 3; const b = 5 | 2; const c = ~5; const d = 1 << 31; const e = -1…
  5. Sep 18, 2026Post #3503
  6. Sep 18, 2026CHALLENGE let i = 0; const key = () => `k${i++}`; const obj = { [key()]: i, [key()]: i, [k…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →