0
0
Node.jsframework~5 mins

Custom event emitter classes in Node.js

Choose your learning style9 modes available
Introduction

Custom event emitter classes let you create your own events and respond to them. This helps different parts of your program talk to each other easily.

You want to run some code when something happens, like a file finishes loading.
You need to notify many parts of your app about a change, like a user logging in.
You want to organize your code so events trigger actions without tight connections.
You are building a chat app and want to handle new messages as events.
You want to react to timers or external signals in a clean way.
Syntax
Node.js
const EventEmitter = require('events');

class MyEmitter extends EventEmitter {
  // custom methods or properties can go here
}

const emitter = new MyEmitter();
emitter.on('eventName', () => {
  console.log('Event happened!');
});
emitter.emit('eventName');

Use on to listen for an event.

Use emit to trigger the event and run all listeners.

Examples
This example listens for a 'greet' event and prints 'Hello!' when it happens.
Node.js
const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const emitter = new MyEmitter();

emitter.on('greet', () => {
  console.log('Hello!');
});

emitter.emit('greet');
This example shows how to pass data with the event. The listener gets the message and prints it.
Node.js
const EventEmitter = require('events');

class MyEmitter extends EventEmitter {}

const emitter = new MyEmitter();

emitter.on('data', (msg) => {
  console.log('Received:', msg);
});

emitter.emit('data', 'This is a message');
This example adds a custom method to emit an event, making the code cleaner.
Node.js
const EventEmitter = require('events');

class MyEmitter extends EventEmitter {
  sendMessage(msg) {
    this.emit('message', msg);
  }
}

const emitter = new MyEmitter();

emitter.on('message', (msg) => {
  console.log('Message:', msg);
});

emitter.sendMessage('Hi there!');
Sample Program

This program creates a TaskRunner class that emits 'start' and 'finish' events when running a task. Listeners print messages when these events happen. It simulates a task with a 1-second delay.

Node.js
const EventEmitter = require('events');

class TaskRunner extends EventEmitter {
  run(taskName) {
    console.log(`Starting task: ${taskName}`);
    this.emit('start', taskName);
    // Simulate task work with a timeout
    setTimeout(() => {
      this.emit('finish', taskName);
      console.log(`Finished task: ${taskName}`);
    }, 1000);
  }
}

const runner = new TaskRunner();

runner.on('start', (name) => {
  console.log(`Event: Task '${name}' has started.`);
});

runner.on('finish', (name) => {
  console.log(`Event: Task '${name}' has finished.`);
});

runner.run('CleanUp');
OutputSuccess
Important Notes

Always remove listeners if they are no longer needed to avoid memory leaks.

Use once if you want a listener to run only one time.

Event names are case-sensitive strings.

Summary

Custom event emitter classes help your code parts communicate by sending and listening to events.

You create a class extending EventEmitter, then use on and emit to handle events.

This pattern keeps your code organized and easy to extend.