typestar

EventEmitter in JavaScript

Node's own observer pattern, with once, off and error handling.

import { EventEmitter, once } from "node:events";

class Runner extends EventEmitter {
  finish(tpm) {
    this.emit("run", { tpm });
    if (tpm < 50) this.emit("slow", tpm);
  }
}

const runner = new Runner();
const seen = [];

runner.on("run", ({ tpm }) => seen.push(`run:${tpm}`));
runner.once("slow", (tpm) => seen.push(`slow:${tpm}`));

runner.finish(104);
runner.finish(40);
runner.finish(30);
console.log(seen, runner.listenerCount("run"));

setTimeout(() => runner.emit("run", { tpm: 1 }), 1);
const [payload] = await once(runner, "run");
console.log("awaited", payload.tpm);

How it works

  1. on subscribes, once unsubscribes itself after firing.
  2. An unhandled error event throws, which is deliberate.
  3. events.once awaits the next emission as a promise.

Keywords and builtins used here

The run, in numbers

Lines
23
Characters to type
572
Tokens
189
Three-star pace
105 tpm

At the three-star pace of 105 tokens a minute, this run takes about 108 seconds.

Type this snippet

Step 1 of 2 in Events & timers, step 10 of 18 in Node.js.

← Previous Next →