«Що таке event loop і як він працює з call stack та чергою?»

(Для простоти поки що вважатимемо, що черга одна. У наступній лекції побачимо, що насправді їх дві.)

Event loop — не частина V8. Це поширена помилка. Event loop у Node.js реалізований бібліотекою libuv (C-бібліотека для асинхронного I/O), не самим JS-рушієм. V8 відповідає за виконання JavaScript, тримає call stack і обробляє microtask queue (продовження після await, .then()). Libuv координує коли передати керування назад у V8, забираючи готові задачі з черги.

Дійові особи, і де саме вони живуть:

  • Call Stack — належить V8 (JS-рушію). Node.js використовує цей стек для виконання твого тестового коду.
  • Черга — тут з’являється продовження, коли приходить відповідь від браузера.
  • Браузер — окремий процес зі своїм власним call stack, який тебе як тестувальника не стосується.
  • Event loop (у libuv) — координує, коли готова задача з черги передається назад у V8 на виконання.

Покроково, на прикладі await click(); await waitFor();:

Call Stack / Черга / Браузер — повний цикл двох await

1. click() виконується                    │ —          │ —
2. відправила запит, звільнилась → СТЕК ПОРОЖНІЙ │ —  │ обробляє клік
3. порожній                                │ —          │ клік завершено, шле "готово"
4. порожній                                │ callback1 у черзі │ —
5. event loop передає callback1 у V8, той кладе на стек │ порожньо │ —
6. callback1 виконується: викликає waitFor()│ —         │ —
7. waitFor() відправила запит, стек порожній│ —         │ шукає елемент
8. порожній                                │ —          │ знайшов, шле "готово"
9. порожній                                │ callback2 у черзі │ —
10. event loop передає callback2 у V8      │ порожньо   │ —

Чому callback не летить напряму на стек, а спочатку в чергу: JS виконує лише одну функцію за раз. Якби готовий код клався одразу на стек — він міг би влізти посеред того, що вже там виконується, і перервати на середині. Черга — буфер ввічливості: новий код чекає, поки стек не звільниться сам, і тільки тоді event loop його забирає.

🗣 Як читати вголос Event loop не частина V8, і це поширена помилка. У Node.js event loop реалізований бібліотекою libuv, окремою C-бібліотекою для асинхронного I/O. V8 відповідає за виконання JavaScript, тримає call stack і обробляє microtask queue. Libuv координує коли передати керування назад у V8, забираючи готові задачі з черги. Важливо розуміти де що фізично живе: call stack належить V8, Node.js його використовує для виконання твого тестового коду. Браузер має свій власний окремий call stack який нас не стосується. Кожен await в тесті це окремий повний цикл: відправили команду, стек звільнився, браузер обробляє, браузер відповів, callback потрапив у чергу, event loop переніс його назад у V8, код продовжився. І головне питання яке варто собі поставити: чому callback не летить одразу на стек, а спочатку чекає в черзі? Тому що JavaScript виконує лише одну функцію за раз, і якби готовий код клався прямо на стек, він міг би перервати посеред виконання щось, що там вже є. Черга гарантує що новий код завжди чекає, поки стек не звільниться сам природним шляхом.