Async JavaScript in Node.jsLesson 2.4
Node.js EventEmitter: building event-driven components
EventEmitter class, emit, on, once, removeListener, off, extending EventEmitter, memory leak warnings, custom events
EventEmitter Is the Core of Node.js
Node.js is built on the observer pattern. EventEmitter lets objects emit named events that any number of listener functions can subscribe to. Streams, HTTP servers, and many core APIs extend EventEmitter.
const { EventEmitter } = require('events');
const emitter = new EventEmitter();
emitter.on('data', (chunk) => {
console.log('Received:', chunk);
});
emitter.once('end', () => {
console.log('Fires only once');
});
emitter.emit('data', 'hello');
emitter.emit('end');Extending EventEmitter
class FileWatcher extends EventEmitter {
watch(path) {
const fs = require('fs');
fs.watch(path, (event) => {
this.emit('change', { event, path });
});
}
}
const watcher = new FileWatcher();
watcher.on('change', ({ event, path }) => {
console.log(path + ' changed: ' + event);
});
watcher.watch('./config.json');Avoid Memory Leaks
Node.js warns when more than 10 listeners are attached to a single event โ a common sign of a leak. Remove listeners when done with emitter.off('event', handler) or emitter.removeAllListeners('event'). Always store the handler reference if you need to remove it later.
