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
onsubscribes,onceunsubscribes itself after firing.- An unhandled
errorevent throws, which is deliberate. events.onceawaits the next emission as a promise.
Keywords and builtins used here
awaitclassconstextendsfromifimportthis
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.
Step 1 of 2 in Events & timers, step 10 of 18 in Node.js.