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!

Node.js - Event Loop

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:

  1. Single-threaded: JavaScript berjalan di satu thread saja, berarti dia hanya bisa melakukan satu hal pada saat yang sama.
  2. Non-blocking: Node.js bisa menangani banyak operasi tanpa menunggu setiap operasi selesai sebelum melanjutkan ke yang berikutnya.
  3. 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:

  1. Jalankan kode sinkron di stack panggilan
  2. Periksa timer (setTimeout, setInterval)
  3. Periksa operasi I/O yang ditunda
  4. Jalankan callback setImmediate
  5. 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:

  1. "First" dicatat segera.
  2. setTimeout ditemui, tetapi bukannya menunggu, Node.js menyetel timer dan melanjutkan.
  3. "Third" dicatat.
  4. 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:

  1. "Start" dan "End" dicatat segera.
  2. Pertama setTimeout dan setImmediate diantrikan.
  3. Operasi pembacaan file dimulai.
  4. 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