If you worked with JavaScript in the browser, you know how much of the interaction of the user is handled through events: mouse clicks, keyboard button presses, reacting to mouse movements, and so on.
On the backend side, Node offers us the option to build a similar system using the events
module.
This module, in particular, offers the EventEmitter
class, which we'll use to handle our events.
You initialize an EventEmitter object using this syntax:
const EventEmitter = require('events')
const eventEmitter = new EventEmitter()
This object exposes, among many others, the on
and emit
methods.
emit
is used to trigger an eventon
is used to add a callback function that's going to be executed when the event is triggered
For example, let's create a start
event, and as a matter of providing a sample, we react to that by just logging to the console:
eventEmitter.on('start', () => {
console.log('started')
})
When we run
eventEmitter.emit('start')
the event handler function is triggered, and we get the console log.
addListener()
is an alias for on()
, in case you see that used.
You can pass arguments to the event handler by passing them as additional arguments to emit()
:
eventEmitter.on('start', (number) => {
console.log(`started ${number}`)
})
eventEmitter.emit('start', 23)
Multiple arguments:
eventEmitter.on('start', (start, end) => {
console.log(`started from ${start} to ${end}`)
})
eventEmitter.emit('start', 1, 100)
The EventEmitter object also exposes the once()
method, which you can use to create a one-time event listener.
Once that event is fired, the listener stops listening.
Example:
eventEmitter.once('start', () => {
console.log(`started!`)
})
eventEmitter.emit('start')
eventEmitter.emit('start') //not going to fire
Once you create an event listener, you can remove it using the removeListener()
method.
To do so, we must first have a reference to the callback function of on
.
In this example:
eventEmitter.on('start', () => {
console.log('started')
})
Extract the callback:
const callback = () => {
console.log('started')
}
eventEmitter.on('start', callback)
So that later you can call
eventEmitter.removeListener('start', callback)
You can also remove all listeners at once on an event, using:
eventEmitter.removeAllListeners('start')
The eventNames()
method, called on an EventEmitter object instance, returns an array of strings that represent the events registered on the current EventListener:
const EventEmitter = require('events')
const eventEmitter = new EventEmitter()
eventEmitter.on('start', () => {
console.log('started')
})
eventEmitter.eventNames() // [ 'start' ]
listenerCount()
returns the count of listeners of the event passed as parameter:
eventEmitter.listenerCount('start') //1
If you have multiple listeners, the order of them might be important.
An EventEmitter object instance offers some methods to work with order.
When you add a listener using on
or addListener
, it's added last in the queue of listeners, and called last. Using prependListener
it's added, and called, before other listeners.
When you add a listener using once
, it's added last in the queue of listeners, and called last. Using prependOnceListener
it's added, and called, before other listeners.