Performance: Events vs callbacks decision
This concept affects how asynchronous operations impact responsiveness and CPU usage in Node.js applications.
Jump into concepts and practice - no test required
const EventEmitter = require('events'); class DataFetcher extends EventEmitter { fetch() { database.query('SELECT * FROM table', (err, result) => { if (err) return this.emit('error', err); this.emit('data', result); }); } } const fetcher = new DataFetcher(); fetcher.on('data', (result) => { processData(result, (err, processed) => { if (err) return fetcher.emit('error', err); fetcher.emit('done', processed); }); });
function fetchData(callback) {
database.query('SELECT * FROM table', (err, result) => {
if (err) return callback(err);
processData(result, (err, processed) => {
if (err) return callback(err);
callback(null, processed);
});
});
}| Pattern | Callback Nesting | Event Loop Blocking | Code Complexity | Verdict |
|---|---|---|---|---|
| Callbacks with nesting | High (deep nesting) | Medium (blocking during callbacks) | High (hard to maintain) | [X] Bad |
| Event-driven with emitters | Low (flat event handlers) | Low (non-blocking event dispatch) | Low (clear separation) | [OK] Good |
const EventEmitter = require('events');
const emitter = new EventEmitter();
emitter.on('greet', () => console.log('Hello!'));
emitter.emit('greet');
emitter.emit('greet');const EventEmitter = require('events');
const emitter = new EventEmitter();
function task(callback) {
emitter.emit('done');
callback();
}
task(() => console.log('Callback finished'));
emitter.on('done', () => console.log('Event done'));