Geri çağırma işlevi, basitçe başka bir işleve aktardığınız bir işlevdir, böylece işlev onu daha sonra çağırabilir. Bu, genellikle eşzamansız API'lerde görülür ; API çağrısı eşzamansız olduğu için hemen geri döner, bu nedenle API'nin eşzamansız görevini tamamladığında çağırabileceği bir işlevi ona iletirsiniz.
JavaScript'te düşünebildiğim en basit örnek setTimeout()
işlevdir. İki argümanı kabul eden global bir işlevdir. İlk bağımsız değişken geri arama işlevi ve ikinci bağımsız değişken milisaniye cinsinden bir gecikmedir. İşlev, uygun süre kadar beklemek ve ardından geri arama işlevinizi çağırmak üzere tasarlanmıştır.
setTimeout(function () {
console.log("10 seconds later...");
}, 10000);
Yukarıdaki kodu daha önce görmüş olabilirsiniz, ancak ilettiğiniz işleve geri arama işlevi denildiğini fark etmemiş olabilirsiniz. Daha açık hale getirmek için yukarıdaki kodu yeniden yazabiliriz.
var callback = function () {
console.log("10 seconds later...");
};
setTimeout(callback, 10000);
Geri aramalar, Node'da her yerde kullanılır, çünkü Node, yaptığı her şeyde asenkron olacak şekilde sıfırdan oluşturulur. Dosya sistemiyle konuşurken bile. Bu nedenle, bir ton dahili Düğüm API'si, bir değişkene atayabileceğiniz verileri döndürmek yerine geri arama işlevlerini bağımsız değişken olarak kabul eder. Bunun yerine, geri arama işlevinizi çağırır ve istediğiniz verileri bağımsız değişken olarak iletir. Örneğin, fs
bir dosyayı okumak için Node'un kitaplığını kullanabilirsiniz. fs
Modül iki benzersiz API işlevlerini sunar: readFile
ve readFileSync
.
readFile
İken fonksiyon eşzamansızsa readFileSync
besbelli değil. Sen onlar kendilerine denilen olduğundan mümkün zaman uyumsuz aramaları kullanmak niyetinde olduğunu görebilirsiniz readFile
ve readFileSync
yerine readFile
ve readFileAsync
. İşte her iki işlevi de kullanmanın bir örneği.
Senkron:
var data = fs.readFileSync('test.txt');
console.log(data);
Yukarıdaki kod, tüm içeriği test.txt
belleğe okunana ve değişkende saklanana kadar iş parçacığı yürütmeyi engeller data
. Düğümde bu genellikle kötü bir uygulama olarak kabul edilir. Ancak, basit ama sıkıcı bir şey yapmak için hızlı küçük bir senaryo yazarken ve yapabileceğiniz her nanosaniye zamanını kurtarmayı pek umursamadığınız zamanlar da vardır.
Eşzamansız (geri arama ile):
var callback = function (err, data) {
if (err) return console.error(err);
console.log(data);
};
fs.readFile('test.txt', callback);
İlk önce iki argüman kabul eden bir geri çağırma işlevi oluşturuyoruz err
ve data
. Eşzamansız işlevlerle ilgili bir sorun, hataları tuzağa düşürmenin daha zor hale gelmesidir, bu nedenle birçok geri arama tarzı API, geri arama işlevinin ilk bağımsız değişkeni olarak hataları iletir. err
Başka bir şey yapmadan önce bir değeri olup olmadığını kontrol etmek en iyi uygulamadır . Öyleyse, geri aramanın yürütülmesini durdurun ve hatayı günlüğe kaydedin.
Eşzamanlı çağrılar, atılan istisnalar olduğunda bir avantaja sahiptir, çünkü bunları bir try/catch
blokla yakalayabilirsiniz .
try {
var data = fs.readFileSync('test.txt');
console.log(data);
} catch (err) {
console.error(err);
}
Eşzamansız işlevlerde bu şekilde çalışmaz. API çağrısı hemen geri döner, böylece try/catch
. Geri aramaları kullanan uygun zaman uyumsuz API'ler her zaman kendi hatalarını yakalar ve ardından bu hataları, uygun gördüğünüz şekilde işleyebileceğiniz geri aramaya iletir.
Geri aramalara ek olarak, yaygın olarak kullanılan ve söz adı verilen başka bir popüler API stili vardır. Onlar hakkında okumak isterseniz, bu cevaba dayanarak yazdığım blog yazısının tamamını burada okuyabilirsiniz .