2017-01-30 10 views
0

私はNode.jsを新しく使いました。私はfs.readFile()と混同しました。コールバックが引数として含まれていると、fs.readFileにラッパーが必要なのはなぜですか?

は当初、私はこれがnull印刷、しかし私は

fs.readFile("file.txt",function(err,data) { 
    if(err) {throw err;} 
    console.log(data); 
}); 

を使用してファイルを読むことができると考えました。私はdocumentationと相談し、まったく同じ例とそれがうまくいくと主張します!

その後、私は解決策がコールバックを取る、独自の機能でfs.readFile()をラップしていることを、スタックオーバーフローを相談しthis postthis postで見つかった:

また
function read(file,callback) { 
    fs.readFile("file.txt",function(err,data) { 
     if(err) {throw err;} 
     callback(data); 
    }); 
} 

read(file, function(data) { 
    console.log(data); 
}); 

、それだけで新しい変数にデータを代入することが可能です:

var content; 
fs.readFile("file.txt",function(err,data) { 
    if(err) {throw err;} 
    content = data; 
    console.log(content); 
}); 

私の理解では、非同期関数は(ここでは、ファイルの内容)いくつかの値を完了し、返すときに、コールバックが返されたデータ上で動作するということです。

  1. fs.readFile(file,callback)は、コールバック関数に渡されることを想定した場合fs.readFile()が完了する前に、なぜそれは一見、コールバックを実行していますか?

  2. なぜデータを別の変数に割り当てるのが変わるのですか?

ありがとう。

+0

あなたの最初のコード*ん*うまく動作します。その前に 'var fs = require(" fs ");'があり、現在のディレクトリに "file.txt"というファイルがあると仮定して動作します。 – Pointy

+0

Hmm。私はもう一度試してみるとうまくいった。私は前に私のエラーを引き起こしていたのだろうか。 –

答えて

1
fs.readFile("file.txt",function(err,data) { 
    if(err) {throw err;} 
    console.log(data); 
}); 

実際には動作しますか。 何働かないことである。

と理由がfs.readLineがあることを意味し、あなたのコードに非同期であるということです(あなたが参照されていたポストにあった一例です)

var content; 
fs.readFile("file.txt",function(err,data) { 
     if(err) {throw err;} 
     content = data; 
    }); 
console.log(content); 

実行はfs.readLineの応答を待たずにただちに実行されます。

fs.readLine答え(すなわち、コールバックがトリガされる)で戻る前したがって後者の例の場合、

console.log(content); 

は実行されます。

一般的に、非同期メソッドを実行することはできませんし、すぐに答えを返すことはできません。非同期の考え方はブロックされないという考え方で、実行/プログラムは非同期メソッドが応答で返される前に実行されます。

非同期メソッドのコールバックの目的は、完了時にメソッドに通知して結果を通知する方法を提供することです。 fs.readLineで問題が解決しないラップ

、それだけでファイルを読み込むための、よりクリーンなインターフェイスを提供します(代わりに「fs.readLine」を呼び出すあなたが「読み」だけで呼ぶだろう)

+0

私はきれいなインターフェイスの目的は、私が最初に持っていた問題を避けるためです:)。素晴らしい説明。 –

関連する問題