NelsonLabs

EventEmitter

Node.js is built on an event-driven architecture. The EventEmitter class is at its core — it lets you emit named events and register listeners for them. Understanding it explains how streams, HTTP servers, and many Node APIs work.

EventEmitter
javascript
const EventEmitter = require("events");

// Create an emitter
const emitter = new EventEmitter();

// Register a listener
emitter.on("data-received", (data) => {
  console.log("Received:", data);
});

// Register a one-time listener
emitter.once("connected", () => {
  console.log("Connected! (fires only once)");
});

// Emit events
emitter.emit("connected");
emitter.emit("data-received", { id: 1, name: "Nelson" });
emitter.emit("data-received", { id: 2, name: "Alice" });

// Remove a listener
const handler = (data) => console.log(data);
emitter.on("update", handler);
emitter.off("update", handler);  // or emitter.removeListener("update", handler)
Extending EventEmitter — real-world pattern
javascript
const EventEmitter = require("events");

class DataProcessor extends EventEmitter {
  constructor() {
    super();
    this.processed = 0;
  }

  process(records) {
    for (const record of records) {
      // Do work
      const result = transform(record);
      this.processed++;

      // Emit events others can listen to
      this.emit("record-processed", result);

      if (this.processed % 100 === 0) {
        this.emit("progress", { processed: this.processed });
      }
    }
    this.emit("done", { total: this.processed });
  }
}

const processor = new DataProcessor();

processor.on("progress", ({ processed }) => {
  console.log(`Progress: ${processed} records`);
});

processor.on("done", ({ total }) => {
  console.log(`Complete: ${total} records processed`);
});

processor.process(myData);