Callback Function
Fungsi sebagai argumen: fondasi pemrograman async dan pola yang dipakai di seluruh JavaScript.
Fungsi yang dikirim sebagai data
Di JavaScript, fungsi adalah warga kelas satu: bisa disimpan di variabel, dikembalikan dari fungsi, dan dikirim sebagai argumen. Fungsi yang dikirim sebagai argumen untuk dipanggil nanti disebut callback.
function proses(nama, callback) {
console.log("Memproses " + nama + "...");
callback(); // panggil nanti
}
proses("data", () => {
console.log("Selesai diproses!");
});Analoginya seperti memberi nomor telepon ke kurir: "kalau paket sampai, hubungi nomor ini". Kamu tidak menunggu di depan pintu, kurir yang menghubungimu nanti.
Callback sudah kamu pakai
Tanpa sadar, kamu sudah memakai callback di banyak tempat:
// array method
[1, 2, 3].forEach(n => console.log(n));
// event
tombol.addEventListener("click", () => console.log("diklik"));
// timer
setTimeout(() => console.log("nanti"), 1000);Semuanya mengikuti pola sama: "ini yang harus dilakukan, lakukan saat waktunya tiba".
Callback untuk operasi async
Kegunaan utama callback adalah operasi yang butuh waktu: baca file, request API, query database.
function ambilData(callback) {
setTimeout(() => {
callback({ nama: "Rizky" }); // data "datang" setelah 1 detik
}, 1000);
}
ambilData((data) => {
console.log("Data diterima: " + data.nama);
});
console.log("Tidak menunggu...");Program tidak berhenti menunggu. Ia lanjut jalan, dan callback dipanggil saat data siap.
Callback hell: sisi gelapnya
Operasi async bertingkat membuat callback bersarang dalam, dikenal sebagai callback hell:
login(user, () => {
ambilProfil(() => {
ambilPostingan(() => {
// makin dalam, makin sulit dibaca
});
});
});Inilah alasan Promise dan async/await diciptakan. Callback tetap penting dipahami karena ia fondasi keduanya.
Catatan teknis: Konvensi callback Node.js adalah error-first: callback(error, hasil). Jika operasi gagal, argumen pertama berisi error dan hasil null. Selalu cek error dulu di dalam callback sebelum memakai hasilnya.
Studi kasus: pipeline pengolahan data
Callback memungkinkan tahapan proses yang bisa diganti-ganti:
function pipeline(data, ...tahap) {
let hasil = data;
for (let fn of tahap) {
hasil = fn(hasil);
}
return hasil;
}
let bersih = pipeline(
" HELLO world ",
s => s.trim(),
s => s.toLowerCase(),
s => s[0].toUpperCase() + s.slice(1)
);
console.log(bersih); // "Hello world"Fungsi pipeline menerima data dan tahap-tahap berupa callback, lalu menjalankannya berurutan. Mau tambah tahap? Tinggal selipkan callback baru tanpa mengubah fungsi pipeline. Ini cikal bakal konsep middleware di framework backend.
Kesimpulan
Callback = "panggil fungsi ini saat selesai". Pahami polanya sampai mendarah daging karena Promise, async/await, event, dan array method semuanya dibangun di atas konsep ini.