nodeJs geri aramalarının basit örneği


120

herhangi biri bana basit bir nodeJs geri aramaları örneği verebilir mi? Bir çok web sitesinde aynısını zaten aradım, ancak tam olarak anlayamıyorum, Lütfen bana basit bir örnek verin.

getDbFiles(store, function(files){
    getCdnFiles(store, function(files){
    })
})

Böyle bir şey yapmak istiyorum ...


argüman olarak geri aramayı alan bir işlevin nasıl yazılacağına dair bir örnek?
Gntem

evet bunun gibi bir şey, anlamama yardımcı olan herhangi bir basit örnek.
Bhushan Goel

2
Geri arama, parametre olarak başka bir işleve ilettiğiniz bir işlevdir ... Google pls -> "geri arama javascript" -> ilk sonuç
Gabriel Llamas

Yanıtlar:


198
var myCallback = function(data) {
  console.log('got data: '+data);
};

var usingItNow = function(callback) {
  callback('get it?');
};

Şimdi düğümü veya tarayıcı konsolunu açın ve yukarıdaki tanımları yapıştırın.

Sonunda bunu bir sonraki satırda kullanın:

usingItNow(myCallback);

Düğüm Tarzı Hata Sözleşmelerine İlişkin Olarak

Costa, düğüm hatası geri arama kurallarına uyarsak bunun nasıl görüneceğini sordu.

Bu kuralda, geri arama, hata olarak en az bir bağımsız değişken, ilk bağımsız değişken almayı beklemelidir. İsteğe bağlı olarak, bağlama bağlı olarak bir veya daha fazla ek argümanımız olacaktır. Bu durumda bağlam, yukarıdaki örneğimizdir.

Burada, bu sözleşmedeki örneğimizi yeniden yazıyorum.

var myCallback = function(err, data) {
  if (err) throw err; // Check for the error and throw if it exists.
  console.log('got data: '+data); // Otherwise proceed as usual.
};

var usingItNow = function(callback) {
  callback(null, 'get it?'); // I dont want to throw an error, so I pass null for the error argument
};

Bir hata durumunu simüle etmek istiyorsak, bu şekilde ItNow kullanarak tanımlayabiliriz

var usingItNow = function(callback) {
  var myError = new Error('My custom error!');
  callback(myError, 'get it?'); // I send my error as the first argument.
};

Nihai kullanım yukarıdakiyle tamamen aynıdır:

usingItNow(myCallback);

Davranıştaki tek fark, usingItNowtanımladığınız sürümüne bağlı olacaktır : ilk bağımsız değişken için geri aramaya bir "doğru değeri" (bir Hata nesnesi) besleyen veya hata bağımsız değişkeni için onu boş olarak besleyen .


Öyleyse bu, ilk parametre kuralı olarak hata ile neye benziyor?
Costa

113

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, fsbir dosyayı okumak için Node'un kitaplığını kullanabilirsiniz. fsModül iki benzersiz API işlevlerini sunar: readFileve readFileSync.

readFileİken fonksiyon eşzamansızsa readFileSyncbesbelli değil. Sen onlar kendilerine denilen olduğundan mümkün zaman uyumsuz aramaları kullanmak niyetinde olduğunu görebilirsiniz readFileve readFileSyncyerine readFileve 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.txtbelleğ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 errve 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. errBaş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/catchblokla 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 .


3
oldukça ayrıntılı ama özlü bir kavram sunumu; benim gibi bir node.js başlatıcısı için ...
kmonsoor

3
Çok fazla bağlam sağlamak için +1. Yalnızca geri arama işlevlerinin neye benzediğini değil, ne olduklarını, neden kullanıldıklarını ve neden çok kullanıldığını. Yeni başlayanlara gerçekten yardımcı oldu.
Azurespot

1
Harika! bu kendi başına bir gönderi olabilir!
Pablo Glez

1
Öyle ve bir içermektedir ikinci bölümünü vaat hakkında;)
Chev

1
Bu, kabul edilen cevaptan çok daha iyi bir açıklamadır! SO'da kabul edilen her cevabın böyle olmasını isterim - yalnızca sorunu çözen bir kod parçası değil, aynı zamanda sorunu NEDEN ve NASIL çözdüğü de. Temel olarak, bu cevap ve geri arama çağrısı, geri aramanın ne olduğu konusunda size oldukça sağlam bir anlayış verecektir.
RusI

10

Metin dosyasını fs.readFileve ile kopyalamaya bir örnek fs.writeFile:

var fs = require('fs');

var copyFile = function(source, destination, next) {
  // we should read source file first
  fs.readFile(source, function(err, data) {
    if (err) return next(err); // error occurred
    // now we can write data to destination file
    fs.writeFile(destination, data, next);
  });
};

Ve bu, copyFileişlevi kullanmanın bir örneğidir :

copyFile('foo.txt', 'bar.txt', function(err) {
  if (err) {
    // either fs.readFile or fs.writeFile returned an error
    console.log(err.stack || err);
  } else {
    console.log('Success!');
  }
});

Yaygın node.js kalıbı, geri arama işlevinin ilk bağımsız değişkeninin bir hata olduğunu gösterir. Bu modeli kullanmalısınız çünkü tüm kontrol akışı modülleri ona güvenir:

next(new Error('I cannot do it!')); // error

next(null, results); // no error occurred, return result

2
sırada ne var? Değişken sonuçlar nedir = ne denir?
Göçebe Coder

3
@SemicolonWarrier hem benim hem de diğerleri için bir işaretçi: stackoverflow.com/questions/5384526/javascript-node-js-next
kmonsoor

7

Bu örneği okuyabildiğiniz kadar basit deneyin, uygulamayı çalıştırmak için sadece kopyalayıp kaydet newfile.js do node newfile yapın.

function myNew(next){
    console.log("Im the one who initates callback");
    next("nope", "success");
}


myNew(function(err, res){
    console.log("I got back from callback",err, res);
});

3

olarak basit bir işlev oluşturuyoruz

callBackFunction (data, function ( err, response ){
     console.log(response)
}) 

// callbackfunction 
function callBackFuntion (data, callback){
    //write your logic and return your result as
callback("",result) //if not error
callback(error, "") //if error
}

1
const fs = require('fs');

fs.stat('input.txt', function (err, stats) {
    if(err){
        console.log(err);
    } else {
        console.log(stats);
        console.log('Completed Reading File');
    }
});

'fs', dosyayı okumanıza yardımcı olan bir düğüm modülüdür. Geri çağırma işlevi, 'input.txt' adlı dosyanızın çalıştırılmadan önce tamamen okunmasını sağlar. fs.stat () işlevi, dosya boyutu, oluşturulma tarihi ve değiştirilme tarihi gibi dosya bilgilerini almaktır.


1

//delay callback function
function delay (seconds, callback){
    setTimeout(() =>{
      console.log('The long delay ended');
      callback('Task Complete');
    }, seconds*1000);
}
//Execute delay function
delay(1, res => {  
    console.log(res);  
})


0

A callback, bir Higher Order Function( wikipedia ) öğesine parametre olarak iletilen bir işlevdir . Geri aramanın basit bir uygulaması şöyle olacaktır:

const func = callback => callback('Hello World!');

İşlevi çağırmak için, tanımlanan işleve bağımsız değişken olarak başka bir işlevi iletin.

func(string => console.log(string));

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.