nodeJsコールバックの簡単な例


120

nodeJsコールバックの簡単な例を教えてもらえますか?私はすでに多くのWebサイトで同じものを検索しましたが、正しく理解できません。簡単な例を教えてください。

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

そんなことしたい...


コールバックを引数としてとる関数の書き方の例は?
Gntem 2013年

ええそのようなもの、私がそれを理解するのに役立つ簡単な例。
Bhushan Goel 2013年

2
コールバックは、別の関数にパラメーターとして渡す関数です... Googleのpls-> "callback javascript"->最初の結果
Gabriel Llamas

回答:


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

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

次に、ノードまたはブラウザコンソールを開き、上記の定義を貼り付けます。

最後に、次の行で使用します。

usingItNow(myCallback);

ノードスタイルのエラー規約に関して

Costaは、ノードエラーコールバック規則を尊重するとどうなるかを尋ねました。

この規則では、コールバックは少なくとも1つの引数、最初の引数をエラーとして受け取ることを期待する必要があります。オプションで、コンテキストに応じて、1つ以上の追加の引数があります。この場合、コンテキストは上記の例です。

ここで、この規則の例を書き直します。

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

エラーケースをシミュレートする場合は、次のようにusingItNowを定義できます。

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

最終的な使い方は上記とまったく同じです。

usingItNow(myCallback);

動作の唯一の違いは、usingItNow定義したバージョンに依存します。「真の値」(Errorオブジェクト)を最初の引数のコールバックにフィードするもの、またはエラー引数のnullをフィードするもの。


では、最初のパラメーターの規則としてエラーが発生すると、これはどのようになりますか?
コスタ

113

コールバック関数は、後で別の関数を呼び出すことができるように、単に別の関数に渡す関数です。これは一般的に非同期APIで見られます。API呼び出しは非同期であるため、すぐに戻ります。非同期タスクの実行が完了したときにAPIが呼び出すことができる関数をその関数に渡します。

JavaScriptで考えることができる最も単純な例はsetTimeout()関数です。これは、2つの引数を受け入れるグローバル関数です。最初の引数はコールバック関数で、2番目の引数はミリ秒単位の遅延です。この関数は、適切な時間待機してからコールバック関数を呼び出すように設計されています。

setTimeout(function () {
  console.log("10 seconds later...");
}, 10000);

前に上記のコードを見たことがあるかもしれませんが、渡した関数がコールバック関数と呼ばれていることに気づかなかっただけです。上記のコードを書き直して、わかりやすくすることができます。

var callback = function () {
  console.log("10 seconds later...");
};
setTimeout(callback, 10000);

Nodeはすべての場所で非同期になるようにゼロから構築されているため、コールバックはNodeのあらゆる場所で使用されます。ファイルシステムと話しているときでも。そのため、多くの内部Node APIは、変数に割り当てることができるデータを返すのではなく、コールバック関数を引数として受け入れます。代わりに、コールバック関数を呼び出し、必要なデータを引数として渡します。たとえば、Nodeのfsライブラリを使用してファイルを読み取ることができます。fsモジュールは、2つの固有のAPI関数を公開しますreadFilereadFileSync

readFile一方、関数は非同期でreadFileSync明らかではありません。あなたは、彼らがそれらを呼ばれるので、可能な限り非同期呼び出しを使用するためにあなたを意図していることがわかりますreadFileし、readFileSync代わりにreadFilereadFileAsync。両方の関数を使用する例を次に示します。

同期:

var data = fs.readFileSync('test.txt');
console.log(data);

上記のコードは、のすべての内容がtest.txtメモリに読み込まれて変数に格納されるまで、スレッドの実行をブロックしますdata。ノードでは、これは通常、悪い習慣と見なされます。ただし、簡単で面倒なことを行う簡単なスクリプトを作成する場合など、便利な場合もあり、ナノ秒単位で節約できる時間をあまり気にしません。

非同期(コールバックあり):

var callback = function (err, data) {
  if (err) return console.error(err);
  console.log(data);
};
fs.readFile('test.txt', callback);

まず、2つの引数errとを受け入れるコールバック関数を作成しますdata。非同期関数の1つの問題は、エラーをトラップすることがより困難になるため、多くのコールバックスタイルAPIがエラーをコールバック関数の最初の引数として渡すことです。err他に何かを行う前に、が値を持っているかどうかを確認することをお勧めします。その場合、コールバックの実行を停止し、エラーをログに記録します。

同期呼び出しは、例外をスローするときにtry/catchブロックでキャッチできるので便利です。

try {
  var data = fs.readFileSync('test.txt');
  console.log(data);
} catch (err) {
  console.error(err);
}

非同期関数では、そのようには機能しません。API呼び出しはすぐに戻るので、でキャッチするものはありませんtry/catch。コールバックを使用する適切な非同期APIは、常に独自のエラーをキャッチしてから、それらのエラーをコールバックに渡し、必要に応じて処理できるようにします。

ただし、コールバックに加えて、一般的に使用されているもう1つの一般的なAPIスタイルには、promiseと呼ばれるものがあります。それらについて読みたい場合は、この回答に基づいて私が書いたブログ投稿全体をここで読むことができます


3
かなり精巧でありながら簡潔なコンセプトの提供。私のようなnode.jsスターターの場合...
kmonsoor

3
多くのコンテキストを提供するための+1。コールバック関数がどのように見えるかだけでなく、それらが何であるか、それらが使用される理由、およびそれらが頻繁に使用される理由。初心者には本当に役立ちます。
Azurespot 2018年

1
すごい!これはそれ自体で投稿になる可能性があります!
Pablo Glez、2018年

1
それは、そしてそれは約束についての第二部を含んでいます;)
Chev

1
これは受け入れられた答えよりもはるかに良い説明です!問題を解決するコードの一部、だけでなく、 -私はそのようなことをSOにここにすべての受け入れ答えをみたいWHYをし、どのようにそれが問題を解決します。基本的に、この回答とコールバックヘルは、コールバックが何であるかをかなりしっかりと理解するでしょう。
RusI

10

fs.readFileandでテキストファイルをコピーする例を次に示します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);
  });
};

そしてそれはcopyFile関数の使用例です:

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

共通のnode.jsパターンは、コールバック関数の最初の引数がエラーであることを示唆しています。すべての制御フローモジュールがそれに依存しているため、このパターンを使用する必要があります。

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

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

2
次は何ですか?変数results =とは何ですか?
セミコロンウォリアー2014年

3
@SemicolonWarrierは私と他の人へのポインタ: stackoverflow.com/questions/5384526/javascript-node-js-next
kmonsoor 2016年

7

この例を読みやすいように試してください。アプリケーションを実行するには、save newfile.js do node newfileをコピーします。

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

シンプルな関数を作成しています

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」は、ファイルの読み取りに役立つノードモジュールです。コールバック関数は、「input.txt」という名前のファイルが実行される前に完全に読み取られることを確認します。fs.stat()関数は、ファイルサイズ、作成日、変更日などのファイル情報を取得します。


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 callbackHigher Order Functionwikipedia)にパラメーターとして渡される関数です。コールバックの簡単な実装は次のようになります。

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

関数を呼び出すには、定義された関数の引数として別の関数を渡すだけです。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.