Як підписатися на подію?
1. Підписка через .on(eventName, listener)
Метод .on() реєструє обробник (listener) для вказаної події.
Коли подія генерується за допомогою .emit(), викликаються всі обробники, підписані через .on().
Приклад:
const EventEmitter = require('events');
const emitter = new EventEmitter();
// Підписка на подію 'message'
emitter.on('message', (data) => {
console.log('Отримано повідомлення:', data);
});
// Генерація події
emitter.emit('message', 'Привіт, Node.js!');Вивід:
Отримано повідомлення: Привіт, Node.js!2. Підписка через .once(eventName, listener)
Метод .once() схожий на .on(),
але обробник спрацьовує лише один раз, а потім автоматично видаляється.
Приклад:
emitter.once('connect', () => {
console.log('Підключення встановлено (лише один раз)');
});
emitter.emit('connect'); // спрацює
emitter.emit('connect'); // більше не викличеться3. Кілька підписників на одну подію
Можна підписати кілька обробників на одну подію - вони будуть викликані в порядку реєстрації:
emitter.on('update', () => console.log('Перший обробник'));
emitter.on('update', () => console.log('Другий обробник'));
emitter.emit('update');Вивід:
Перший обробник
Другий обробник4. Видалення підписки
Якщо потрібно відписатися від події, використовують .off() чи .removeListener():
function handler() {
console.log('Відбулася подія');
}
emitter.on('event', handler);
emitter.emit('event'); // спрацює
emitter.off('event', handler);
emitter.emit('event'); // не спрацює5. Де використовується підписка на події в Node.js
Багато вбудованих об'єктів - це EventEmitter, і в них ті самі методи .on() і .once():
const fs = require('fs');
const stream = fs.createReadStream('file.txt');
// Підписка на системні події
stream.on('data', (chunk) => console.log('Отримано шматок даних'));
stream.on('end', () => console.log('Читання завершено'));
stream.on('error', (err) => console.error('Помилка:', err));Те саме працює з:
http.Server(on('request', handler))net.Socket(on('connect', handler))process(on('exit', handler))
Підсумок
Щоб підписатися на подію в Node.js, потрібно використати метод
.on(eventName, listener)об'єктаEventEmitter.
.on()- постійна підписка.once()- одноразова підписка.off()/.removeListener()- відпискаЦей механізм використовується всюди: у потоках, HTTP, файловій системі, процесах і користувацьких подіях.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.