0
0
Node.jsframework~5 mins

Removing listeners in Node.js

Choose your learning style9 modes available
Introduction
Removing listeners helps stop functions from running when an event happens. This keeps your program clean and avoids unwanted actions.
You want to stop reacting to a button click after some time.
You need to remove a listener to prevent memory leaks in a long-running app.
You want to change the behavior by removing old listeners before adding new ones.
You want to disable a feature temporarily by removing its event listener.
Syntax
Node.js
const EventEmitter = require('events');
const emitter = new EventEmitter();

function listenerFunction() {
  console.log('Event happened');
}

// Add listener
emitter.on('eventName', listenerFunction);

// Remove listener
emitter.removeListener('eventName', listenerFunction);
// or
emitter.off('eventName', listenerFunction);
Use the exact same function reference to remove a listener. Anonymous functions cannot be removed easily.
removeListener and off do the same thing; off is preferred in newer Node.js versions.
Examples
Listener is added and then removed. Emitting the event after removal does not call the listener.
Node.js
const EventEmitter = require('events');
const emitter = new EventEmitter();

function greet() {
  console.log('Hello!');
}

// Add listener
emitter.on('sayHello', greet);

// Remove listener
emitter.removeListener('sayHello', greet);

// Emitting event now does nothing
emitter.emit('sayHello');
Removing an anonymous listener like this does not work because the function references differ.
Node.js
const EventEmitter = require('events');
const emitter = new EventEmitter();

// Using anonymous function
emitter.on('event', () => console.log('Hi'));

// Trying to remove anonymous listener (won't work)
emitter.removeListener('event', () => console.log('Hi'));

emitter.emit('event');
Only the secondListener runs because firstListener was removed.
Node.js
const EventEmitter = require('events');
const emitter = new EventEmitter();

function firstListener() {
  console.log('First');
}

function secondListener() {
  console.log('Second');
}

emitter.on('multi', firstListener);
emitter.on('multi', secondListener);

// Remove only firstListener
emitter.off('multi', firstListener);

emitter.emit('multi');
Sample Program
This program adds a listener for 'data' event, emits it to show the listener runs, then removes the listener and emits again to show it no longer runs.
Node.js
const EventEmitter = require('events');

const emitter = new EventEmitter();

function onData() {
  console.log('Data received');
}

console.log('Adding listener...');
emitter.on('data', onData);

console.log('Emitting data event:');
emitter.emit('data');

console.log('Removing listener...');
emitter.removeListener('data', onData);

console.log('Emitting data event again:');
emitter.emit('data');
OutputSuccess
Important Notes
Removing a listener takes O(n) time where n is the number of listeners for that event.
Space complexity is O(1) for removing a listener since it just updates internal arrays.
A common mistake is trying to remove a listener using a different or anonymous function reference.
Use removing listeners to avoid memory leaks and unexpected behavior in apps that run for a long time.
Summary
Removing listeners stops functions from running on events.
You must use the exact same function reference to remove a listener.
Use removeListener or off methods to remove listeners in Node.js.