Bir geri çağırma fonksiyonu, başka bir fonksiyona geçirilen bir parametre şeklindeki fonksiyondur. Geri çağırma fonksiyonu, ikinci fonksiyonun içinde çağrılır ya da icra edilir. Geri çağırma fonksiyonları, asenkron olarak icra edilirler.
Node.js sunucusunun nasıl çalıştığını anlamak önemlidir. Örneğin büyük bir dosyayı İnternet'ten indirirken, diğer işlemlerin de aksamamasını isteyelim. Bir başka deyişle, indirme işlemi diğer işlemleri durdurmasın ya da engellemesin. İndirme işleminin arka planda sürmesini, işlem bitince de bir fonksiyonu çağırmak istediğimizde, asenkron çalışma modu uygulanmalıdır. Arka planda bir işlem yürürken, diğer talepleri kabul etmeli ve sistemi bloke etmemelidir.
Senkron çalışmada kodu fonksiyon olarak aşağıdaki gibi yazacağınızı biliyorsunuz:
var sonuc;
function dosyaOku(){
var fs = require('fs');
sonuc = fs.readFileSync("gyDosya.txt", "utf8");
return sonuc;
}
dosyaOku();
console.log(sonuc);
Yukarıdaki kod içinde, dosyaOku() adlı bir fonksiyon tanımlanmıştır. Bu fonksiyon bir dosyayı okuyacak ve içeriğini bellekte bir değişkende saklayacaktır. Fonksiyon çağrıldığı zaman, veriyi yüklemek için çok fazla zaman gerekiyorsa bu, diğer işlemlerin bloke olmasını yani diğer işlemlerin, bu işlemin bitmesini beklemelerini gerektirir.
Bu senkron kodda beklenen bir durumdur; çünkü program icrası yukarıdan aşağıya sıralı biçimde gerçekleştirilir. Node.js, asenkron bir platformda geri çağırmaları kullanır; veritabanı sorguları ya da büyük dosya okumaları gibi işlemlerin tamamlanması beklenmeden diğer işlemler araya girebilir. Geri çağırma fonksiyonu verilen bir iş tamamlanınca çağrılır; bu bloklamayı önler. Diğer kod bileşenleri bu arada icra edilebilir. Aşağıdaki kodu inceleyelim:
var fs = require('fs');
var icerik;
function dosyaoku(callback){
fs.readFile("gyDosya.txt", "utf8", function(err, okunanIcerik) {
icerik=okunanIcerik;
if (err) {
return console.error(err.stack);
}
callback(okunanIcerik);
})
};
function oku() {
console.log(icerik);
}
dosyaoku(oku);
console.log('Dosya okunuyor....');
Yukarıdaki kod içinde, readFile() fonksiyonu ile dosyanın okuması tamamlanınca, callback değişkeni (callback()) çağrılacaktır. Sadece fonksiyon çağrılacak, bunun dışındaki her şey hataya sebep olacaktır. Bir fonksiyon çağrıldığı zaman, bu fonksiyon içindeki kod icra edilecektir. (Burada console.log(icerik) deyimi icra edilecek)
Yukarıda yazdığımız kod gereksiz biçimde karmaşık gibi görülebilir; ancak geri çağırma kullanarak asenkron çalışma Node.js'in temel özelliğidir.