2016-08-29 11 views
1

私は非同期プログラミングを初めて使用しています。最近、私は本当に理解していないケースを見つけました。この例では:readFileの外部スコープ変数にアクセス

var username = "abc"; 
fs.readFile(filePath, { encoding: 'utf-8' }, function (err, oldUsername) { 
    console.log(username); // Print xyz 
    if (username == oldUsername) 
     // do something, since username is now 'xyz', result failed! 
}); 
username = "xyz"; 

私は(ABC)が、結果は失敗したように、コンソール印刷「XYZ」に、ファイルに入った旧ユーザを比較したいです。

にはどうすればユーザ名の無修正値を得るのですか?

+1

コールバック内のユーザー名を変更するのはあなたの孤独な選択のようです。または、あなたの値を保持するtmp変数を作成してください – mfrachet

+0

@Skahrzこれは私に30分詰まってしまったので、あなたは私のためにそれを指摘しました。私はちょうどコールバック内のユーザー名を変更したいと思います。より良い選択肢はないようです。 – NewJedi

答えて

0

そのコールバック関数内のすべてのコードを覚えておく必要があります。コード内の他のすべてが実行されるまで実際には実行されません。

あなたは関数を定義していて、実行していません。それを他の関数(readFile)の引数として渡すので、その関数が非同期のI/Oで終了したときにいつでも呼び出すことができます。

私は封筒に返信アドレスを置くようなものだと思いますが、封筒の一次アドレスが処理されるまで問題はありません。

最後に別の値を割り当てることになり、console.logが実行される前に終了します。

詳細情報は、例えば、そこにある:

イベントループモデルの非常に興味深い特性は、他の言語、決してブロックの多くとは異なり、JavaScriptのことです。 I/Oの処理は、通常、イベントやコールバックを介して行われるため、アプリケーションがIndexedDBクエリを返すかXHR要求を返すのを待っているときに、ユーザー入力などの他の処理を実行できます。 [1]

幸運! :)

+1

私は非同期を理解しましたが、これはまだ非常に役に立ちます。 – NewJedi

関連する問題