2016-07-10 4 views
0

私は、サンプルコードを持っており、出力は以下の通りです: コードを:nodejsのコールバック関数はどのように動作していますか?

for(var i = 0; i <20; i++) { 
    var fs = require("fs"); 

    fs.readFile('input2.txt', function (err, data) { 
     if (err) return console.error(err); 
     console.log("first started\n"); 
     console.log(data.toString()); 
    }); 

    console.log("first Ended"); 

    console.log("second started"); 
    var data = fs.readFileSync('input1.txt'); 

    console.log(data.toString()); 
    console.log("second Ended"); 
} 

出力:

最初 秒 第二 が最初 が第二開始日に終了したに終了した開始日に終了しました など20回まで 最初のスタート D
は、最初の20回

input2.txtはそれでひとつの文字を持っていないとinput1.txtはそれでラインの何を持っていたよう

まで 1などを開始しました。私は、コールバック関数は、ファイル読み取り操作がその時点までに完了する必要があるため、1回の繰り返し後に1番目のファイルからの入力を印刷した後に呼び出されると想定していました。しかし、そうではない。最初に同期操作を完了していることを意味し、コールバックだけが機能しています。それはどのように可能でしょうか?コールバックが長い間待たなければならない場合、ここで非同期呼び出しの目的は何ですか?

+0

と思います見てください。どのように 'setTimeout()'がコールバックが起こる前に現在の実行ティックが完了するのを待っているのか分かっていれば、 'fs.readFile()'はまったく同じように動作します。指定されたミリ秒数ではなくファイルの読み込み時間に依存します。 –

答えて

0

forループは完了まで同期して実行され、すべての非同期(つまり、後で終了することを意味します)のオペレーションを開始します。

ループが終了すると、非同期操作が終了し、1つずつ順番に処理されます(開始された順ではありません)。

node.jsの独自のJavascriptはシングルスレッドなので、現在の実行スレッドが完了して実行され、完了するまでループが実行されます。 forループの各反復は、非同期であるfs.readFile()オペレーションを開始します。その操作は、ループが続く間にバックグラウンドで実行されます(for)。 fs.readFile()操作が完了すると、そのコールバックがJSイベントキューに追加されます。現在の実行スレッドが終了すると、Javascriptインタプリタは最初の項目をイベントキューから取り出し、実行します(その時点でイベントキューに何かがある場合)。その時点でイベントキューに何もない場合(非同期操作がまだ完了していないため、JSエンジンは次のイベントが発生するのを待機し、最初の非同期操作が完了してコールバックをイベントキューに入れると、 JSエンジンがそのイベントを処理し、そのコールバックを呼び出す

このような非同期コールバックは、 JSの終了

をこの答えは、Ajaxのために書かれましたが、ブラウザで呼び出して、イベントキューの概念は非常にこれも説明を助けるかもしれないのNode.jsでも同じです。How does JavaScript handle AJAX responses in the background?

0

asyncという名前の関数がnode.jsの次のティックでコールされるとき

スニペットでは、ループ内のすべてのステートメントが現在のティックで呼び出され、実行されます。しかし、ファイルasyncを読み込むコールバックは、実行する次のティックキューに入れます。

``のsetTimeout(...) ``のようなfs.readFile(...)のProcess.nextTick

関連する問題