Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Чому події в Node.js асинхронні?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Тому що Node.js побудований на неблокуючому I/O та Event Loop (libuv) - операція передається в libuv, код продовжує виконуватись далі, а обробник події викликається пізніше, коли операція завершиться і callback дістанеться з черги. **Ключове:** асинхронність не означає багатопотоковість - події обробляються послідовно, тому довгий CPU-важкий обробник блокує решту, важкі обчислення варто виносити у Worker Threads.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 1. Що означає «асинхронні події» > Асинхронні події - це такі, які **не блокують виконання програми** > і **обробляються пізніше**, коли Node.js завершить поточні операції. Тобто код не "чекає", поки подія відбудеться - замість цього реєструється **обробник (callback)**, який буде викликаний, коли подія *насправді трапиться*. ### Приклад: ```javascript const fs = require('fs'); fs.readFile('file.txt', 'utf8', (err, data) => { console.log('Файл прочитано!'); }); console.log('Цей рядок виводиться раніше!'); ``` Вивід: ```javascript Цей рядок виводиться раніше! Файл прочитано! ``` Чому? Тому що операція читання файлу - це **I/O** (повільна, виконується ОС), Node.js не чекає її завершення, а продовжує виконувати код. Коли операція завершується - викликається **подія** `on('data')` чи callback з черги Event Loop. ## 2. Чому так зроблено Node.js - **однопотокове середовище**, і якби воно чекало кожну подію синхронно: - весь потік **зависав** би на час очікування файлу, мережі чи бази даних; - інші запити **не оброблялися б**. Асинхронні події дозволяють: - не блокувати потік; - обробляти **тисячі паралельних запитів**; - використовувати **один потік** для безлічі операцій. ## 3. Як це працює всередині (Event Loop) Механізм, який робить події асинхронними, - це **Event Loop** (цикл подій, реалізований у бібліотеці `libuv`). Схема: 1. Node.js запускає JavaScript-код (основний потік). 2. Коли викликається I/O операція (файл, мережа тощо), вона передається в **libuv**. 3. Коли операція завершується, **libuv** ставить callback у **чергу подій**. 4. Коли Event Loop звільняється, він **дістає** завдання з черги і **викликає callback**. Таким чином, подія обробляється **пізніше**, а не одразу - звідси й асинхронність. ## 4. Приклад ланцюжка подій ```javascript const EventEmitter = require('events'); const emitter = new EventEmitter(); emitter.on('ready', () => { console.log('Готово!'); }); setTimeout(() => emitter.emit('ready'), 0); console.log('Запуск програми...'); ``` Вивід: ```javascript Запуск програми... Готово! ``` Чому: - `emit('ready')` викликається на **наступній ітерації Event Loop**; - спочатку виконується синхронний код, потім обробляються події з черги. ## 5. Переваги асинхронних подій | Перевага | Опис | |---|---| | Висока продуктивність | Один потік може обробляти тисячі I/O операцій | | Масштабованість | Не потрібно створювати потік на кожен запит | | Ефективне використання ресурсів | Потік не простоює, поки ОС виконує I/O | | Реактивність | Застосунок реагує на події в міру їх надходження | ## 6. Але важливо пам'ятати - **Події обробляються послідовно** - якщо один обробник працює занадто довго (CPU-bound), він **блокує** решту подій. - Node.js асинхронний для I/O, але **не багатопотоковий** - важкі обчислення краще виносити у `Worker Threads` чи інші процеси. ## Підсумок > Події в Node.js **асинхронні**, тому що: > > - Node.js побудований на **неблокуючому I/O**; > - використовується **Event Loop**, який обробляє події, коли вони готові; > - це дозволяє **не блокувати** потік виконання; > - і забезпечує **високу продуктивність та масштабованість** при роботі з мережею, файлами й запитами.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.