Pengantar Asynchronous JavaScript
JavaScript secara default berjalan secara
single-threaded
, artinya hanya bisa menjalankan satu perintah dalam satu waktu. Namun, banyak operasi yang memerlukan waktu lama seperti pengambilan data dari server, membaca file, atau menunggu timer. Untuk menghindari aplikasi menjadi tidak responsif, JavaScript menggunakan mekanisme
asynchronous
agar operasi tersebut bisa berjalan di latar belakang tanpa menghentikan eksekusi kode lainnya.
Dalam ebook ini, kita akan mempelajari berbagai teknik asynchronous di JavaScript mulai dari callback, promises, async/await, hingga memahami bagaimana event loop bekerja di balik layar.
1. Callback Functions
Callback adalah fungsi yang dikirim sebagai argumen ke fungsi lain dan akan dipanggil setelah operasi asynchronous selesai. Ini adalah cara paling dasar untuk menangani asynchronous di JavaScript.
Contoh sederhana callback:
function fetchData(callback) {
setTimeout(() => {
const data = 'Data dari server';
callback(data);
}, 2000);
}
fetchData(function(result) {
console.log('Hasil:', result);
});
Pada contoh di atas,
fetchData
menerima sebuah fungsi callback yang akan dipanggil setelah 2 detik dengan data yang didapat. Namun, penggunaan callback bisa menyebabkan
callback hell
jika terlalu banyak callback bersarang.
2. Promises
Promise adalah objek yang mewakili hasil operasi asynchronous yang mungkin selesai sekarang, nanti, atau gagal. Promise membantu menghindari callback hell dan membuat kode lebih mudah dibaca.
Contoh penggunaan Promise:
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const success = true;
if (success) {
resolve('Data berhasil diambil');
} else {
reject('Gagal mengambil data');
}
}, 2000);
});
}
fetchData()
.then(result => console.log(result))
.catch(error => console.error(error));
Promise memiliki tiga status:
pending
(menunggu),
fulfilled
(berhasil), dan
rejected
(gagal). Dengan method
then
dan
catch
, kita bisa menangani hasil atau error dari Promise.
3. Async / Await
async
dan
await
adalah sintaks modern untuk menangani Promise dengan cara yang lebih mirip kode synchronous, sehingga lebih mudah dibaca dan ditulis.
Contoh penggunaan async/await:
function fetchData() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Data berhasil diambil dengan async/await');
}, 2000);
});
}
async function getData() {
try {
const result = await fetchData();
console.log(result);
} catch (error) {
console.error(error);
}
}
getData();
Dengan async/await, kita bisa menulis kode asynchronous yang lebih bersih dan mudah dipahami, terutama saat ada banyak operasi asynchronous berurutan.
4. Event Loop dan Concurrency Model
Event Loop adalah mekanisme yang memungkinkan JavaScript menjalankan operasi asynchronous dengan cara memantau call stack dan task queue. Ini yang membuat JavaScript tetap responsif meskipun ada operasi yang berjalan di latar belakang.
Secara sederhana, event loop akan terus memeriksa apakah call stack kosong. Jika kosong, ia akan mengambil task dari task queue dan mengeksekusinya.
Ada dua jenis queue utama:
macrotask queue
(misal: setTimeout, setInterval) dan
microtask queue
(misal: Promise callbacks). Microtask queue diproses terlebih dahulu sebelum macrotask.
Memahami event loop sangat penting untuk debugging dan mengoptimalkan aplikasi JavaScript asynchronous.
Source Code Contoh dan Channel Pembelajaran
Berikut ini adalah contoh lengkap source code yang menggabungkan callback, Promise, dan async/await untuk simulasi pengambilan data:
// Callback example
function fetchDataCallback(callback) {
setTimeout(() => {
callback('Data dari callback');
}, 1000);
}
// Promise example
function fetchDataPromise() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Data dari Promise');
}, 1500);
});
}
// Async/Await example
async function fetchDataAsync() {
const data = await fetchDataPromise();
return data + ' (dari async/await)';
}
// Menggunakan ketiganya
fetchDataCallback((result) => {
console.log('Callback:', result);
});
fetchDataPromise()
.then(result => console.log('Promise:', result));
fetchDataAsync()
.then(result => console.log('Async/Await:', result));
Untuk memperdalam pemahaman, berikut beberapa channel dan sumber belajar yang sangat direkomendasikan:
Kesimpulan dan Tips Belajar
Menguasai asynchronous JavaScript adalah kunci untuk membangun aplikasi web modern yang responsif dan efisien. Mulailah dengan memahami callback, kemudian pelajari Promise, dan akhirnya kuasai async/await. Jangan lupa untuk memahami bagaimana event loop bekerja agar bisa menulis kode yang optimal dan mudah di-debug.
Tips belajar:
-
Praktikkan contoh-contoh sederhana secara langsung di browser console atau editor online seperti CodeSandbox.
-
Baca dokumentasi resmi dan artikel dari sumber terpercaya.
-
Tonton video tutorial untuk mendapatkan penjelasan visual dan contoh nyata.
-
Eksperimen dengan membuat proyek kecil yang menggunakan asynchronous JavaScript.
-
Gunakan debugger dan console.log untuk memahami alur eksekusi kode asynchronous.
Selamat belajar dan semoga sukses menguasai Asynchronous JavaScript!