Asynchronous dan event loop
setTimeout, callback, event loop — kenapa async ada.
Pahami konsepnya
JavaScript adalah single-threaded — satu tugas pada satu waktu. Bila tugas butuh 5 detik (misal ambil data dari server), seluruh halaman membeku. Asynchronous memecahkan ini: tugas lambat "diparkir", JavaScript lanjut, dan hasil diambil lewat callback saat siap.
setTimeout(fn, ms) menjadwalkan fn setelah ms milidetik — paling dasar dari async. Callback adalah fungsi yang dipanggil "nanti": saat timer selesai, saat data tiba, saat pengguna klik. Callback hell terjadi saat callback bersarang terlalu dalam — Promise datang menyelesaikannya.
Event loop adalah mesin di baliknya: call stack mengeksekusi sinkron, callback queue menunggu, dan event loop memindahkan callback ke stack saat stack kosong. Ini kenapa setTimeout(fn, 0) TIDAK berjalan seketika — ia menunggu stack kosong.
Coba contoh kode
console.log("1: mulai");
setTimeout(() => console.log("3: timer 0ms"), 0);
setTimeout(() => console.log("4: timer 100ms"), 100);
console.log("2: sinkron selesai");
// Urutan keluaran: 1, 2, 3, 4
// setTimeout 0 TIDAK berjalan seketika — menunggu stack kosong.Urutan keluaran menunjukkan event loop: kode sinkron (1, 2) selesai dulu, baru timer diambil dari queue (3, 4). setTimeout 0 menunggu stack kosong, bukan nol milidetik literal.
Latihan singkat
Uji: setTimeout order — `sekarang` lalu `nanti`.