Node.js - Event Loop: Membongkar.Magic di Balik Asynchronous JavaScript

Hai sana, para ahli pengoding masa depan! Hari ini, kita akan memulai perjalanan menarik ke hati Node.js - Event Loop. Jangan khawatir jika Anda belum pernah menulis satu baris kode sebelumnya; saya akan menjadi panduan ramah Anda melalui dunia yang menarik ini. Pada akhir tutorial ini, Anda akan mengerti bagaimana Node.js bisa melakukan banyak hal sekaligus, sama seperti Anda menjongkok tugas, Netflix, dan mengirim pesan kepada teman-teman Anda!

Node.js - Event Loop

Apa Itu Event Loop?

Bayangkan Anda adalah seorang koki di dapur restoran yang sibuk. Anda punya banyak masakan yang sedang dimasak, timer yang berbunyi, dan pesanan yang masuk. Bagaimana Anda mengelola semuanya tanpa membakar makanan atau menunggu pelanggan? Itu sebenarnya apa yang dilakukan Event Loop bagi Node.js!

Event Loop seperti seorang koki 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, berarti itu hanya bisa melakukan satu hal pada saat yang sama.
  2. Non-blocking: Node.js bisa mengelola banyak operasi tanpa menunggu setiap operasi selesai sebelum melanjutkan ke yang berikutnya.
  3. Asynchronous: Tugas dapat dimulai sekarang dan selesai kemudian, memungkinkan kode lainnya untuk berjalan di antara waktu itu.

Bagaimana Event Loop Bekerja?

Mari kita pecah Event Loop menjadi langkah-langkah yang mudah dimengerti:

  1. Eksekusi kode sinkron di stack panggilan
  2. Periksa timer (setTimeout, setInterval)
  3. Periksa operasi I/O yang ditunda
  4. Eksekusi callback setImmediate
  5. Tangani event 'close'

Sekarang, mari kita lihat ini dalam aksi 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

Bertambah kejutan? Ini menunjukkan bagaimana Node.js mengelola operasi asinkron tanpa memblokir 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 beberapa 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 telah melihat Event Loop dalam aksi, mari kita jelajahi fase-fasanya secara detil:

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 Idle, Prepare

Penggunaan internal saja. Tidak ada yang perlu dilihat di sini, teman-teman!

4. Fase Poll

Mengambil event I/O baru dan menjalankan callback yang berkaitan dengan I/O.

const fs = require('fs');

fs.readFile('example.txt', (err, data) => {
if (err) throw err;
console.log(data);
});

5. Fase Check

Callback setImmediate() diaktifkan di sini.

setImmediate(() => console.log("I'm immediate!"));

6. Fase Callback Close

Beberapa callback close, misalnya socket.on('close', ...), diproses di sini.

Menyatukan Semua

Mari kita buat contoh yang lebih kompleks yang memanfaatkan 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 akan mengejutkan Anda:

  1. "Start" dan "End" dicatat segera.
  2. Pertama setTimeout dan setImmediate diantrikan.
  3. Operasi membaca file dimulai.
  4. Event Loop mulai iterasinya:
  • Callback pertama setTimeout dieksekusi.
  • Callback pertama setImmediate dieksekusi.
  • Ketika operasi membaca file selesai, callbacknya dieksekusi.
  • Dalam callback operasi membaca file, setTimeout dan setImmediate lainnya diantrikan.
  • Kedua setImmediate dieksekusi sebelum kedua setTimeout.

Metode Event Loop Umum

Berikut adalah tabel metode yang berkaitan dengan Event Loop di Node.js:

Metode Deskripsi
setTimeout(callback, delay) Eksekusi callback setelah delay milidetik
setInterval(callback, interval) Eksekusi callback secara berulang setiap interval milidetik
setImmediate(callback) Eksekusi callback pada iterasi berikutnya dari Event Loop
process.nextTick(callback) Menambahkan callback ke "queue next tick" yang diproses setelah operasi saat ini selesai

Kesimpulan

Selamat! Anda telah mengambil langkah pertama ke dunia menarik Node.js dan Event Loop. Ingat, seperti belajar menunggang sepeda, menguasai pemrograman asinkron memerlukan latihan. Jangan frustasi jika itu belum berjalan segera - terus mencoba dan segera Anda akan menulis kode non-blocking seperti seorang pro!

Saat kita menutup, mari kita buat analogi yang menyenangkan: pikirkan Event Loop sebagai kereta kirmir. Tugas-tugas (seperti timer, operasi I/O, dan callback segera) adalah seperti anak-anak yang mencoba untuk naik ke kereta. Event Loop terus berputar, mengambil dan menurunkan tugas dalam urutan khusus, memastikan bahwa setiap orang mendapat giliran tanpa kereta pernah berhenti.

Terus coding, tetap curiga, dan ingat - di dunia Node.js, kesabaran bukan hanya kebaikan, itu adalah callback!

Credits: Image by storyset