Що являє собою модуль events?
1. Що таке модуль events
events- це вбудований модуль Node.js, що реалізує подієвий патерн (Observer / Publisher-Subscriber).
Він дозволяє створювати об'єкти-емітери подій (EventEmitters), які можуть:
- реєструвати обробники подій (
on,once); - генерувати події (
emit); - видаляти обробники (
off,removeListener).
Цей модуль лежить в основі всієї асинхронної поведінки Node.js:
- HTTP-серверів,
- потоків (
stream), - файлової системи (
fs), - мережевих з'єднань (
net,tls), - і навіть самого об'єкта
process.
2. Підключення й створення EventEmitter
const EventEmitter = require('events');
const emitter = new EventEmitter();Тепер emitter - об'єкт, який може випромінювати та слухати події.
3. Основні методи класу EventEmitter
| Метод | Призначення |
|---|---|
on(event, listener) | Підписатися на подію |
once(event, listener) | Підписатися, але викликати обробник лише один раз |
emit(event, [...args]) | Згенерувати (викликати) подію |
off(event, listener) / removeListener | Видалити обробник |
removeAllListeners(event) | Видалити всіх слухачів події |
listenerCount(event) | Дізнатися, скільки слухачів підписано |
eventNames() | Отримати список активних подій |
4. Приклад використання
const EventEmitter = require('events');
const emitter = new EventEmitter();
// Підписуємося на подію "message"
emitter.on('message', (text) => {
console.log('Отримано повідомлення:', text);
});
// Генеруємо подію
emitter.emit('message', 'Привіт, Node.js!');Вивід:
Отримано повідомлення: Привіт, Node.js!5. Приклад із once()
emitter.once('connect', () => {
console.log('Перше підключення');
});
emitter.emit('connect'); // спрацює
emitter.emit('connect'); // ігноруєтьсяonce() корисний для подій, які повинні спрацювати лише один раз
(наприклад, ініціалізація підключення до БД чи запуск сервера).
6. Приклад із видаленням слухачів
function handler() {
console.log('Подія відбулася');
}
emitter.on('event', handler);
emitter.emit('event'); // Спрацює
emitter.off('event', handler);
emitter.emit('event'); // Не спрацює7. Використання в успадкуванні
Багато вбудованих класів Node.js успадковують EventEmitter. Ти можеш створювати свої класи з такою самою поведінкою:
const EventEmitter = require('events');
class Chat extends EventEmitter {
sendMessage(msg) {
console.log('Надсилання:', msg);
this.emit('message', msg);
}
}
const chat = new Chat();
chat.on('message', (msg) => console.log('Отримано:', msg));
chat.sendMessage('Привіт!');Вивід:
Надсилання: Привіт!
Отримано: Привіт!8. Як це працює всередині
Коли викликається .emit(eventName):
- Node.js шукає всіх слухачів, зареєстрованих на
eventName; - Викликає кожного з них по черзі;
- Якщо жодного не знайдено, просто нічого не відбувається.
Усе це працює синхронно, але часто використовується для керування асинхронними процесами (наприклад, сповіщення про завершення I/O).
9. Де використовується events у Node.js
| Модуль | Приклади подій |
|---|---|
http.Server | 'request', 'close', 'connection' |
fs.ReadStream | 'data', 'end', 'error' |
net.Socket | 'connect', 'data', 'timeout', 'end' |
process | 'exit', 'uncaughtException', 'warning' |
child_process | 'message', 'exit' |
Підсумок
Модуль
events- це вбудована основа подієво-орієнтованої архітектури Node.js. Він реалізує класEventEmitter, який дозволяє об'єктам:
- генерувати події (
emit),- слухати їх (
on,once),- керувати підписками (
off,removeListener).Без нього неможливо уявити роботу таких частин Node.js, як
http,fs,streamчиprocess- усі вони успадковують і використовуютьEventEmitter.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.