Node.js - Event Loop: Membongkar Magi di Balik Asynchronous JavaScript
Halo sana, para ahli coding masa depan! Hari ini, kita akan melakukan perjalanan menarik ke dalam hati Node.js - Event Loop. Jangan khawatir jika Anda belum pernah menulis baris kode sebelumnya; saya akan menjadi panduan ramah Anda melalui dunia yang menarik ini. Pada akhir panduan ini, Anda akan memahami bagaimana Node.js bisa melakukan banyak hal sekaligus, seperti Anda menjongkok tugas sekolah, Netflix, dan mengirim pesan kepada teman-teman Anda!
Apa Itu Event Loop?
Bayangkan Anda adalah seorang chef di dapur restoran yang sibuk. Anda mempunyai banyak hidangan yang sedang dimasak, timer yang berbunyi, dan pesanan yang datang. Bagaimana Anda mengelola semuanya tanpa membakar makanan atau membuat pelanggan menunggu? Itu sebenarnya apa yang dilakukan Event Loop bagi Node.js!
Event Loop adalah seperti seorang chef utama, terus memeriksa apa yang memerlukan perhatian dan memastikan bahwa semua hal berjalan mulus. Itu adalah saus rahasia yang memungkinkan Node.js melakukan operasi I/O non-blocking, meskipun JavaScript bersifat single-threaded.
Konsep Utama
Sebelum kita mendalam, mari kenal beberapa konsep utama:
- Single-threaded: JavaScript berjalan di satu thread saja, berarti dia hanya bisa melakukan satu hal pada saat yang sama.
- Non-blocking: Node.js bisa menangani banyak operasi tanpa menunggu setiap operasi selesai sebelum melanjutkan ke yang berikutnya.
- Asynchronous: Tugas dapat dimulai sekarang dan diselesaikan kemudian, memungkinkan kode lainnya berjalan di antara waktu itu.
Bagaimana Event Loop Bekerja?
mari pecahkan Event Loop menjadi langkah yang mudah dipahami:
- Jalankan kode sinkron di stack panggilan
- Periksa timer (setTimeout, setInterval)
- Periksa operasi I/O yang ditunda
- Jalankan callback setImmediate
- Tangani event 'close'
Sekarang, mari kita lihat ini dalam tindakan dengan beberapa contoh kode!
Contoh 1: Kode Sinkron vs. Asinkron
console.log("First");
setTimeout(() => {
console.log("Second");
}, 0);
console.log("Third");
Apa yang Anda pikirkan tentang outputnya? Mari kitauraikan:
- "First" dicatat segera.
- setTimeout ditemui, tetapi bukannya menunggu, Node.js menyetel timer dan melanjutkan.
- "Third" dicatat.
- Event Loop memeriksa timer yang selesai dan menjalankan callback, mencatat "Second".
Output:
First
Third
Second
Berkahwa? Ini menunjukkan bagaimana Node.js menangani operasi asinkron tanpa memblok thread utama.
Contoh 2: Banyak Timer
setTimeout(() => console.log("Timer 1"), 0);
setTimeout(() => console.log("Timer 2"), 0);
setTimeout(() => console.log("Timer 3"), 0);
console.log("Hello from the main thread!");
Dalam contoh ini, kita menyetel banyak timer dengan jeda 0 milidetik. Namun, Event Loop masih akan memproses mereka setelah thread utama selesai.
Output:
Hello from the main thread!
Timer 1
Timer 2
Timer 3
Fase Event Loop
Sekarang kita sudah melihat Event Loop dalam tindakan, mari jelajahi fase-fasanya secara lebih rinci:
1. Fase Timer
Fase ini menjalankan callback yang dijadwalkan oleh setTimeout() dan setInterval().
setTimeout(() => console.log("I'm a timer!"), 100);
setInterval(() => console.log("I repeat every 1 second"), 1000);
2. Fase Callback Tertunda
Di sini, loop menjalankan callback I/O yang ditunda ke iterasi loop berikutnya.
3. Fase Kosong, Persiapan
Penggunaan internal saja. Tidak ada yang perlu dilihat disini, teman-teman!
4. Fase Poll
Mengambil event I/O baru dan menjalankan callback terkait I/O.
const fs = require('fs');
fs.readFile('example.txt', (err, data) => {
if (err) throw err;
console.log(data);
});
5. Fase Check
Callback setImmediate() dipanggil di sini.
setImmediate(() => console.log("I'm immediate!"));
6. Fase Callback Close
Beberapa callback close, misalnya socket.on('close', ...), diproses di sini.
Menggabungkan Semua
Mari buat contoh yang lebih kompleks yang menggunakannya berbagai aspek Event Loop:
const fs = require('fs');
console.log("Start");
setTimeout(() => console.log("Timeout 1"), 0);
setImmediate(() => console.log("Immediate 1"));
fs.readFile('example.txt', (err, data) => {
console.log("File read complete");
setTimeout(() => console.log("Timeout 2"), 0);
setImmediate(() => console.log("Immediate 2"));
});
console.log("End");
Urutan eksekusi mungkin mengejutkan Anda:
- "Start" dan "End" dicatat segera.
- Pertama setTimeout dan setImmediate diantrikan.
- Operasi pembacaan file dimulai.
- Event Loop mulai iterasinya:
- Callback pertama setTimeout dieksekusi.
- Callback pertama setImmediate dieksekusi.
- Saat pembacaan file selesai, callbacknya dieksekusi.
- Dalam callback pembacaan file, setTimeout dan setImmediate lainnya diantrikan.
- SetImmediate kedua dieksekusi sebelum setTimeout kedua.
Metode Event Loop Umum
Berikut adalah tabel metode yang berkaitan dengan Event Loop umum di Node.js:
Metode | Deskripsi |
---|---|
setTimeout(callback, delay) | Menjalankan callback setelah delay milidetik |
setInterval(callback, interval) | Menjalankan callback secara berulang setiap interval milidetik |
setImmediate(callback) | Menjalankan callback pada iterasi berikutnya Event Loop |
process.nextTick(callback) | Menambahkan callback ke "queue next tick" yang diproses setelah operasi saat ini selesai |
Kesimpulan
Selamat! Anda baru saja mengambil langkah pertama ke dalam dunia menarik Node.js dan Event Loop. Ingat, seperti belajar menunggang sepeda, menguasai programming asinkron memerlukan latihan. Jangan frustasi jika itu tidak langsung berjalan - terus mencoba dan segera Anda akan menulis kode non-blocking seperti seorang pro!
Sementara kita menyempurnakan, ini adalah analogi yang menyenangkan: pikirkan Event Loop seperti sebuah kereta gurita. Tugas-tugas (seperti timer, operasi I/O, dan callback segera) adalah seperti anak-anak yang mencoba untuk naik. Event Loop terus berputar, mengambil dan menurunkan tugas dalam urutan khusus, memastikan bahwa semua orang mendapat giliran tanpa kereta berhenti.
Terus coding, tetap curiga, dan ingat - di dunia Node.js, kesabaran bukan hanya kebaikan, itu adalah callback!
Credits: Image by storyset