2017-06-20 14 views
1

JavaScriptをコールバックして練習する関数に次のコードを記述します。関数が完了する前にコールバックを実行するコールバックを持つ関数

fs = require('fs'); 

function funcWithCallback(callback) { 

    fs.readFile('YouBikeTP.txt', 'utf8', function (err,data) { 
    if (err) { 
    return console.log(err); 
    } 
    console.log(data.length); 
    }); 
    callback(); 
} 

funcWithCallback(function(){ 
    console.log("string in callback ") 
}) 

このコードの目的は、メソッドの実行順序を制御することです。テキストファイルの長さが印刷された後の文字列「のコールバック内の文字列は、」印刷する必要がありますが、私はこのコードを実行したときの結果は次のようになります。私は期待された結果ではありません

>> "string in callback" 
>> 91389 //the length of YouBikeTP.txt 

。 は、誰もが、なぜコールバック関数が完了(コールバック)funcWithCallbackの前に呼び出されます?私に言うことができる

>> 91389 //the length of YouBikeTP.txt 
>> "string in callback" 

する必要がありますか私はコールバック関数の意味を誤解しましたか?

答えて

4
このようにコードを変更し

理由:あなたはreadFileの中にコールバックとして定義した関数は非同期コールバックです。すぐには実行されず、ファイルのロードが完了したときに実行されます。したがって、非同期コールバックが完了するとconsole.logの後にメインのコールバック関数を呼び出す必要があります。あなたはreadFile自身のコールバックの内側callback()呼び出しされていません

fs = require('fs'); 

function funcWithCallback(callback) { 

    fs.readFile('YouBikeTP.txt', 'utf8', function (err,data) { 
     if (err) { 
      return console.log(err); 
     } 
     console.log(data.length); 
     callback(); //calling the main callback after the async callback console logs 
    }); 

} 

funcWithCallback(function(){ 
    console.log("string in callback ") 
}) 
+0

返信ありがとうございます、私は上記の同じコードを使用してさらに質問があります。 callback()の前の行(指定した行)のreadFileコールバックでIOバインドされたタスク(別のファイルにデータを保存するか、時間のかかるループ操作)を追加すると、callback I/O-boundタスクが終了するまで? –

+1

yes @張是あなたがしようとしているものは、同期しているとうまくいきます。つまり、自分の答えに従ってコールバックが実行されます。しかし、あなたがやっているタスクが非同期の場合、あなたが達成しようとしている大きなタスクのコールバックの中にメインコールバックを置かなければなりません。約束を使用することもできます。https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise –

1

は、あなただけのreadFileを呼び出した後、それを呼び出している、それはその後にのみ完了した後にそのコールバックfunction (err,data)を呼び出します。

1

fs.readFileコールバック関数でcallback()をコールする必要があります。コールバックは、結果またはエラーで記述されたasyc関数の後にコールする必要があります。

関連する問題