Callback & Pola Error-First
Memahami callback, konvensi error-first khas Node, dan masalah callback hell.
Callback: "hubungi aku kalau sudah selesai"
Callback adalah fungsi yang diberikan kepada fungsi lain untuk dipanggil nanti — biasanya saat operasi asinkron selesai. Ini cara paling dasar Node mengerjakan sesuatu tanpa menunggu.
setTimeout(() => {
console.log('tiga detik kemudian');
}, 3000);
console.log('ini dijalankan lebih dulu');
Konvensi error-first
Hampir semua API asinkron Node memakai pola yang sama: argumen pertama callback adalah error, argumen berikutnya hasil.
const fs = require('fs');
fs.readFile('data.json', 'utf8', (err, isi) => {
if (err) { // selalu periksa error PERTAMA
console.error('Gagal membaca:', err.message);
return; // hentikan; jangan lanjut memakai isi
}
console.log('Isi:', isi);
});
- Sukses:
callback(null, hasil)(error =null). - Gagal:
callback(new Error('pesan')). - Callback dipanggil sekali saja.
Menulis fungsi ber-callback sendiri
function bagi(a, b, callback) {
setTimeout(() => {
if (b === 0) return callback(new Error('Tidak bisa dibagi nol'));
callback(null, a / b);
}, 10);
}
bagi(10, 2, (err, hasil) => {
if (err) return console.error(err.message);
console.log(hasil); // 5
});
Perhatikan: callback dipanggil asinkron (lewat setTimeout) bahkan untuk kasus error. Pola penting: sebuah fungsi sebaiknya konsisten — selalu sinkron atau selalu asinkron, jangan campur ("Zalgo"), karena memanggil callback sinkron di satu kasus dan asinkron di kasus lain membuat perilaku sulit diprediksi.
Callback hell
Operasi berurutan yang saling bergantung membuat callback bersarang makin dalam:
ambilPengguna(1, (e1, user) => {
ambilPesanan(user.id, (e2, pesanan) => {
ambilBarang(pesanan[0], (e3, barang) => {
// ... "piramida malapetaka"
});
});
});
Kode seperti ini sulit dibaca, error handling berulang, dan rawan bug. Solusinya: Promise dan async/await (bab berikutnya). Callback tetap penting dipahami karena banyak API dan pustaka lama memakainya.
Menangani error di callback
try/catchtidak menangkap error yang terjadi di dalam callback asinkron — kode sudah keluar dari blok try saat callback jalan. Itulah mengapa ada argumenerr.- Error yang di-
throwdi dalam callback asinkron bisa mematikan seluruh proses.