Fungsi callback hanyalah sebuah fungsi yang Anda berikan ke fungsi lain sehingga fungsi tersebut dapat memanggilnya di lain waktu. Ini biasanya terlihat di asynchronous API ; panggilan API segera kembali karena asinkron, jadi Anda meneruskan fungsi ke dalamnya yang bisa dipanggil API setelah selesai melakukan tugas asinkronnya.
Contoh paling sederhana yang dapat saya pikirkan dalam JavaScript adalah setTimeout()
fungsinya. Ini adalah fungsi global yang menerima dua argumen. Argumen pertama adalah fungsi panggilan balik dan argumen kedua adalah penundaan dalam milidetik. Fungsi ini dirancang untuk menunggu waktu yang sesuai, kemudian menjalankan fungsi panggilan balik Anda.
setTimeout(function () {
console.log("10 seconds later...");
}, 10000);
Anda mungkin pernah melihat kode di atas sebelumnya tetapi tidak menyadari bahwa fungsi yang Anda lewati disebut fungsi panggilan balik. Kita bisa menulis ulang kode di atas agar lebih jelas.
var callback = function () {
console.log("10 seconds later...");
};
setTimeout(callback, 10000);
Callback digunakan di semua tempat di Node karena Node dibangun dari awal untuk menjadi asynchronous dalam segala hal yang dilakukannya. Bahkan saat berbicara dengan sistem file. Itulah mengapa banyak Node API internal menerima fungsi callback sebagai argumen daripada menampilkan data yang dapat Anda tetapkan ke variabel. Alih-alih itu akan memanggil fungsi panggilan balik Anda, meneruskan data yang Anda inginkan sebagai argumen. Misalnya, Anda bisa menggunakan fs
perpustakaan Node untuk membaca file. The fs
Modul menghadapkan dua fungsi API yang unik: readFile
dan readFileSync
.
The readFile
fungsi asynchronous sementara readFileSync
tidak jelas. Anda dapat melihat bahwa mereka bermaksud agar Anda menggunakan panggilan asinkron kapan pun memungkinkan karena mereka memanggilnya readFile
dan readFileSync
bukannya readFile
dan readFileAsync
. Berikut adalah contoh penggunaan kedua fungsi tersebut.
Sinkronis:
var data = fs.readFileSync('test.txt');
console.log(data);
Kode di atas memblokir eksekusi thread hingga semua konten test.txt
dibaca ke dalam memori dan disimpan dalam variabel data
. Di node ini biasanya dianggap praktik yang buruk. Ada kalanya berguna, seperti ketika menulis skrip kecil cepat untuk melakukan sesuatu yang sederhana namun membosankan dan Anda tidak terlalu peduli untuk menghemat setiap nanodetik waktu yang Anda bisa.
Asynchronous (dengan callback):
var callback = function (err, data) {
if (err) return console.error(err);
console.log(data);
};
fs.readFile('test.txt', callback);
Pertama kita membuat fungsi panggilan balik yang menerima dua argumen err
dan data
. Satu masalah dengan fungsi asynchronous adalah semakin sulitnya menjebak kesalahan sehingga banyak API gaya panggilan balik meneruskan kesalahan sebagai argumen pertama ke fungsi panggilan balik. Praktik terbaiknya adalah memeriksa apakah err
memiliki nilai sebelum Anda melakukan hal lain. Jika demikian, hentikan eksekusi callback dan catat kesalahannya.
Panggilan sinkron memiliki keuntungan ketika ada pengecualian karena Anda dapat dengan mudah menangkapnya dengan satu try/catch
blok.
try {
var data = fs.readFileSync('test.txt');
console.log(data);
} catch (err) {
console.error(err);
}
Dalam fungsi asinkron tidak berfungsi seperti itu. Panggilan API segera kembali sehingga tidak ada yang menarik dengan try/catch
. API asinkron yang tepat yang menggunakan callback akan selalu menangkap kesalahannya sendiri dan kemudian meneruskan kesalahan tersebut ke dalam callback di mana Anda dapat menanganinya sesuai keinginan Anda.
Selain callback, ada gaya API populer lainnya yang biasa digunakan yang disebut promise. Jika Anda ingin membaca tentang mereka maka Anda dapat membaca seluruh posting blog yang saya tulis berdasarkan jawaban ini di sini .