Skip to main content

Що являє собою модуль 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

javascript
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. Приклад використання

javascript
const EventEmitter = require('events'); const emitter = new EventEmitter(); // Підписуємося на подію "message" emitter.on('message', (text) => { console.log('Отримано повідомлення:', text); }); // Генеруємо подію emitter.emit('message', 'Привіт, Node.js!');

Вивід:

javascript
Отримано повідомлення: Привіт, Node.js!

5. Приклад із once()

javascript
emitter.once('connect', () => { console.log('Перше підключення'); }); emitter.emit('connect'); // спрацює emitter.emit('connect'); // ігнорується

once() корисний для подій, які повинні спрацювати лише один раз (наприклад, ініціалізація підключення до БД чи запуск сервера).

6. Приклад із видаленням слухачів

javascript
function handler() { console.log('Подія відбулася'); } emitter.on('event', handler); emitter.emit('event'); // Спрацює emitter.off('event', handler); emitter.emit('event'); // Не спрацює

7. Використання в успадкуванні

Багато вбудованих класів Node.js успадковують EventEmitter. Ти можеш створювати свої класи з такою самою поведінкою:

javascript
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('Привіт!');

Вивід:

javascript
Надсилання: Привіт! Отримано: Привіт!

8. Як це працює всередині

Коли викликається .emit(eventName):

  1. Node.js шукає всіх слухачів, зареєстрованих на eventName;
  2. Викликає кожного з них по черзі;
  3. Якщо жодного не знайдено, просто нічого не відбувається.

Усе це працює синхронно, але часто використовується для керування асинхронними процесами (наприклад, сповіщення про завершення 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.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.