Memahami Node.js Event Loop
Event Loop bukanlah seorang pekerja. Ia adalah seorang koordinator.
Banyak pengembang merasa Event Loop itu kompleks. Kesulitannya sering kali muncul karena mencampur terlalu banyak konsep sekaligus. Anda harus melacak libuv, Call Stack, Promises, dan I/O secara bersamaan.
Inilah kebenaran sederhananya. Event Loop menjadwalkan pekerjaan. Ia tidak melakukan pekerjaan tersebut.
JavaScript berjalan pada single thread. Ini berarti kode berjalan dalam satu garis lurus. Satu tugas harus selesai sebelum tugas berikutnya dimulai. Kita membutuhkan sistem untuk mengelola tugas-tugas asinkron seperti membaca file atau permintaan jaringan tanpa menghentikan seluruh program.
Cara kerjanya:
Event Loop memindahkan callback dari berbagai antrean ke dalam Call Stack. Bayangkan setiap fase sebagai sebuah antrean. Event Loop adalah orang yang memindahkan orang-orang dari antrean ke dalam ruangan.
Fase-fase utamanya adalah:
- Timers: Menangani callback dari setTimeout dan setInterval.
- Pending Callbacks: Menangani kesalahan sistem tertentu seperti kesalahan TCP.
- Idle and Prepare: Fase internal yang digunakan oleh libuv. Anda tidak akan menggunakan fase ini.
- Poll: Fase yang paling penting. Fase ini mengambil event I/O baru seperti pembacaan file atau permintaan HTTP.
- Check: Menangani callback setImmediate.
- Close Callbacks: Menangani event penutupan seperti penutupan socket.
Kesalahan umum adalah mengira bahwa Event Loop memiliki Call Stack sendiri. Padahal tidak. Runtime memiliki satu Call Stack tunggal dan satu microtask queue.
Prosesnya mengikuti alur berikut:
- Event Loop memilih sebuah callback dari fase saat ini.
- Ia memasukkan callback tersebut ke dalam Call Stack.
- Call Stack menjalankan kodenya.
- Setelah callback selesai, engine akan mengosongkan microtask queue. Di sinilah tempat Promises dan async/await berada.
- Event Loop berpindah ke fase berikutnya.
Jika Anda menggunakan setTimeout(..., 0), ia akan masuk ke fase Timers. Jika Anda menggunakan setImmediate(...), ia akan masuk ke fase Check.
Pekerjaan berat dilakukan di OS kernel dan libuv. Event Loop hanya memberi tahu JavaScript kapan waktunya untuk bereaksi.
Sumber: https://dev.to/joaovictor6/event-loop-entendendo-uma-das-bases-do-node-41a