Event Emitters
Node.js has a built-in EventEmitter class in the events module. It lets you build objects that emit named events and register listeners that respond to them. This is the observer pattern.
How it works
- A class extends
EventEmitter. - An instance of that class is created with
new. - A listener is registered with
.on(eventName, handler). - An event is triggered with
.emit(eventName, ...args). - The handler runs every time that event is emitted.
Basic example
// ES module syntax
import { EventEmitter } from 'events';
// CommonJS equivalent:
// const { EventEmitter } = require('events');
class Job extends EventEmitter {}
const job = new Job();
job.on('done', (timeDone) => {
console.log('Job was done at', timeDone);
});
job.emit('done', new Date());
job.removeAllListeners(); // remove all registered listeners
// Output: Job was done at <current time>
Running a listener only once
Use .once() instead of .on() when you only want the handler to fire the first time the event is emitted, no matter how many times it fires after that.
import { EventEmitter } from 'events';
class Emitter extends EventEmitter {}
const emitter = new Emitter();
emitter.once('greeting', () => {
console.log('Hello World');
});
emitter.emit('greeting'); // prints: Hello World
emitter.emit('greeting'); // ignored, listener already ran
// Output: Hello World
Removing listeners
.removeAllListeners() removes every listener from the emitter. You can also remove a specific listener by passing the event name:
emitter.removeAllListeners('greeting'); // removes only 'greeting' listeners
emitter.removeAllListeners(); // removes all listeners on all events
What to read next
- Core Modules : the built-in modules that ship with Node.js
- Modules : how to import and export code in Node.js