Що таке eventemitter у Node.js?
Node.js EventEmitter
EventEmitter є основою подієво-орієнтованої архітектури Node.js. Це вбудований клас (events модуль), який реалізує шаблон спостерігача — дозволяючи об'єктам генерувати події з іменами та реєструвати слухачів.
Основне використання
const EventEmitter = require('events');
const emitter = new EventEmitter();
// Реєстрація слухача
emitter.on('greet', (name) => {
console.log(`Привіт, ${name}!`);
});
// Генерація події
emitter.emit('greet', 'Node.js'); // → Привіт, Node.js!Основні методи
| Метод | Опис |
|---|---|
emitter.on(event, listener) | Додати слухача (псевдонім: addListener) |
emitter.once(event, listener) | Додати одноразового слухача |
emitter.off(event, listener) | Видалити слухача (псевдонім: removeListener) |
emitter.emit(event, ...args) | Генерувати подію |
emitter.removeAllListeners(event) | Видалити всіх слухачів |
emitter.listeners(event) | Перелічити всіх слухачів |
emitter.listenerCount(event) | Порахувати слухачів |
once() — Виклик один раз
emitter.once('connect', () => {
console.log('Підключено! Це викликається лише один раз.');
});
emitter.emit('connect'); // викликається
emitter.emit('connect'); // ігноруєтьсяКлас Custom EventEmitter
const EventEmitter = require('events');
class Database extends EventEmitter {
connect() {
// імітація асинхронного підключення
setTimeout(() => {
this.emit('connected', { host: 'localhost' });
}, 1000);
}
query(sql) {
// імітація запиту
setTimeout(() => {
this.emit('data', [{ id: 1, name: 'Alice' }]);
}, 500);
}
}
const db = new Database();
db.on('connected', ({ host }) => {
console.log(`Підключено до ${host}`);
db.query('SELECT * FROM users');
});
db.on('data', rows => {
console.log('Отримані рядки:', rows);
});
db.connect();Події помилок
'error' є спеціальною подією — якщо вона генерується без слухача, Node.js викидає необроблене виключення:
// Завжди слухайте 'error'!
emitter.on('error', (err) => {
console.error('Виявлена помилка:', err.message);
});
emitter.emit('error', new Error('Щось пішло не так'));Попередження про максимальну кількість слухачів
Node.js попереджає, коли ви додаєте більше 10 слухачів до однієї події (захист від витоків пам'яті):
emitter.setMaxListeners(20); // збільшити ліміт
// або
emitter.setMaxListeners(0); // без обмеженьEventEmitter в основі Node.js
Багато вбудованих об'єктів Node.js розширюють EventEmitter:
http.Server→'request','close','error'net.Socket→'data','end','error'fs.ReadStream→'data','end','error'process→'exit','uncaughtException','SIGTERM'
Підсумок
EventEmitter забезпечує слабку зв'язність та подієво-орієнтовану архітектуру в Node.js. Це основа потоків, HTTP-серверів та більшості основних модулів Node.js. Використовуйте його для створення власних систем, орієнтованих на події, у ваших додатках.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.