Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що являє собою модуль events?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)`events` - вбудований модуль Node.js, що реалізує подієвий патерн (Observer / Publisher-Subscriber) через клас `EventEmitter`: реєстрація обробників (`on`, `once`), генерація подій (`emit`) і видалення обробників (`off`, `removeListener`). **Ключове:** цей модуль лежить в основі майже всієї асинхронної поведінки Node.js - `http`, `stream`, `fs`, `net`, навіть сам об'єкт `process` наслідують `EventEmitter`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 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`.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.