Performance: Custom event emitter classes
This concept affects how efficiently events are handled and propagated in a Node.js application, impacting responsiveness and CPU usage.
Jump into concepts and practice - no test required
const { EventEmitter } = require('events');
class GoodEmitter extends EventEmitter {
// Inherits optimized event handling from Node.js core
}
const emitter = new GoodEmitter();
emitter.on('event', async (data) => {
// handle event asynchronously
});class BadEmitter { constructor() { this.listeners = {}; } on(event, listener) { if (!this.listeners[event]) { this.listeners[event] = []; } this.listeners[event].push(listener); } emit(event, ...args) { if (this.listeners[event]) { this.listeners[event].forEach(listener => { listener(...args); }); } } }
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Custom synchronous event emitter | N/A | N/A | N/A | [X] Bad |
| Node.js built-in EventEmitter with async listeners | N/A | N/A | N/A | [OK] Good |
data in a custom event emitter instance myEmitter?on method is used to register a callback for an event.emit triggers events, listen and trigger are not valid EventEmitter methods.const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const emitter = new MyEmitter();
emitter.on('greet', name => console.log(`Hello, ${name}!`));
emitter.emit('greet', 'Alice');What will be printed when this code runs?on method registers a listener for 'greet' that prints a greeting with the name.emit method triggers 'greet' with argument 'Alice', so the listener runs and prints the message.const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const emitter = new MyEmitter();
emitter.emit('start');
emitter.on('start', () => console.log('Started'));ping is emitted. Which code correctly implements this behavior?super() first in constructor, required before using this.this.on('ping', () => this.count++) to increment count on each ping event.this.on before super(), causing error. class PingCounter extends EventEmitter {
count = 0;
on('ping', () => this.count++);
} has invalid syntax outside constructor. class PingCounter extends EventEmitter {
constructor() {
super();
this.count = 0;
this.emit('ping', () => this.count++);
}
} wrongly uses emit instead of on.