nodeJs callback contoh sederhana

120

dapatkah seseorang memberi saya contoh sederhana dari panggilan balik nodeJs, saya telah mencari hal yang sama di banyak situs web tetapi tidak dapat memahaminya dengan benar, Tolong beri saya contoh sederhana.

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

Saya ingin melakukan sesuatu seperti itu ...

Bhushan Goel
sumber
contoh tentang cara menulis fungsi yang menggunakan callback sebagai argumen?
Gntem
ya sesuatu seperti itu, contoh sederhana yang membantu saya untuk memahaminya.
Bhushan Goel
2
Callback adalah fungsi yang Anda berikan sebagai parameter ke fungsi lain ... Mohon Google -> "callback javascript" -> hasil pertama
Gabriel Llamas

Jawaban:

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

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

Sekarang buka node atau konsol browser dan tempel definisi di atas.

Terakhir gunakan dengan baris berikut ini:

usingItNow(myCallback);

Sehubungan dengan Konvensi Kesalahan Gaya Node

Costa bertanya bagaimana ini akan terlihat jika kita menghormati konvensi panggilan balik kesalahan node.

Dalam konvensi ini, callback harus menerima setidaknya satu argumen, argumen pertama, sebagai kesalahan. Secara opsional kami akan memiliki satu atau lebih argumen tambahan, tergantung pada konteksnya. Dalam hal ini, konteksnya adalah contoh di atas.

Di sini saya menulis ulang contoh kita dalam konvensi ini.

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
};

Jika kita ingin mensimulasikan kasus kesalahan, kita dapat mendefinisikan usingItNow seperti ini

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

Penggunaan akhir persis sama seperti di atas:

usingItNow(myCallback);

Satu-satunya perbedaan dalam perilaku bergantung pada versi mana yang usingItNowAnda tentukan: versi yang memberi "nilai kebenaran" (objek Error) ke callback untuk argumen pertama, atau versi yang memberinya null untuk argumen error .

keyvan
sumber
Jadi bagaimana ini terlihat dengan kesalahan sebagai konvensi parameter pertama?
Costa
113

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 fsperpustakaan Node untuk membaca file. The fsModul menghadapkan dua fungsi API yang unik: readFiledan readFileSync.

The readFilefungsi asynchronous sementara readFileSynctidak jelas. Anda dapat melihat bahwa mereka bermaksud agar Anda menggunakan panggilan asinkron kapan pun memungkinkan karena mereka memanggilnya readFiledan readFileSyncbukannya readFiledan 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.txtdibaca 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 errdan 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 errmemiliki 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/catchblok.

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 .

Chev
sumber
3
penyampaian konsep yang cukup rumit namun ringkas; untuk pemula node.js seperti saya ...
kmonsoor
3
1 untuk memberikan banyak konteks. Tidak hanya seperti apa fungsi callback itu, tetapi apa fungsinya, mengapa digunakan, dan mengapa banyak digunakan. Sangat membantu bagi pemula.
Azurespot
1
Bagus! ini bisa menjadi postingan dengan sendirinya!
Pablo Glez
1
Ya , dan itu termasuk bagian kedua tentang janji;)
Chev
1
Ini adalah penjelasan yang jauh lebih baik daripada jawaban yang diterima! Saya ingin setiap jawaban yang diterima di sini di SO menjadi seperti itu - tidak hanya sepotong kode yang memecahkan masalah, tetapi juga MENGAPA dan BAGAIMANA cara memecahkan masalah. Pada dasarnya, jawaban dan panggilan balik ini akan memberi Anda pemahaman yang cukup kuat tentang apa itu panggilan balik.
RusI
10

Berikut adalah contoh menyalin file teks dengan fs.readFiledan 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);
  });
};

Dan itulah contoh penggunaan copyFilefungsi:

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!');
  }
});

Pola node.js umum menunjukkan bahwa argumen pertama dari fungsi panggilan balik adalah kesalahan. Anda harus menggunakan pola ini karena semua modul aliran kontrol mengandalkannya:

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

next(null, results); // no error occurred, return result
Leonid Beschastny
sumber
2
apa selanjutnya? Apa hasil variabel = apa yang dipanggil?
The Nomadic Coder
3
@SemicolonWarrier penunjuk untuk saya dan juga orang lain: stackoverflow.com/questions/5384526/javascript-node-js-next
kmonsoor
7

Coba contoh ini sesederhana yang Anda bisa baca, cukup salin simpan newfile.js lakukan node newfile untuk menjalankan aplikasi.

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);
});
spacedev
sumber
3

kami membuat fungsi sederhana sebagai

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
}
saurabh kumar
sumber
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' adalah modul node yang membantu Anda membaca file. Fungsi callback akan memastikan bahwa file Anda yang bernama 'input.txt' telah dibaca sepenuhnya sebelum dijalankan. fs.stat () berfungsi untuk mendapatkan informasi file seperti ukuran file, tanggal dibuat dan tanggal diubah.

Anuj Kumar
sumber
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);  
})

Surojit Paul
sumber
0

A callbackadalah fungsi yang dikirimkan sebagai parameter ke a Higher Order Function( wikipedia ). Implementasi sederhana dari callback adalah:

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

Untuk memanggil fungsi tersebut, cukup berikan fungsi lain sebagai argumen ke fungsi yang ditentukan.

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