Events & EventEmitter

Node.js is an event-driven environment. Most of its core functionality is built around an idiomatic asynchronous event-driven architecture.

1. The EventEmitter Class

The EventEmitter class is at the heart of this system. It allows objects to "emit" named events that cause "listeners" (functions) to be called.

const EventEmitter = require('events');

// Create an instance of EventEmitter
const myEmitter = new EventEmitter();

// 1. Create an event listener (on)
myEmitter.on('login', (user) => {
  console.log(`User ${user} has logged in!`);
});

// 2. Emit the event (emit)
myEmitter.emit('login', 'Pradeep');

2. Passing Arguments

You can pass any number of arguments to the listener functions.

myEmitter.on('data_received', (id, status) => {
  console.log(`Item ${id} status is ${status}`);
});

myEmitter.emit('data_received', 101, 'Success');

3. Practical Example: Custom Logger

You can extend the EventEmitter class to build your own event-driven tools.

class Logger extends EventEmitter {
  log(message) {
    console.log('Logging:', message);
    this.emit('messageLogged', { id: 1, url: 'http://' });
  }
}

const logger = new Logger();
logger.on('messageLogged', (arg) => {
  console.log('Listener called with:', arg);
});

logger.log('Hello World');
Important: Listeners are called synchronously in the order they were registered. However, usually the logic inside them is handled asynchronously.