質問: false; fs.readFile(data, function(err, buf){ if(err){ console.log(err); mainWindow.webContents.send('result',"Error: The file is invalid."); flg=true; //ここでflgがtrueになっているはず return -1; } //中略 } console.log(flg) //何故かエラー発生時もfalseのまま ``` `flg=true`より上の処理はされているので、条件分岐は問題なく行われているようなのですが、なぜかflgの値がtrueになりません。 JSの仕様なのか何なのか、おそらく一行目の`flg`が`fs.readFile`内の関数のスコープ上に無いためだと思われるのですが、そうなるとどのようにして外部に値を渡せば良いのかわかりません。 どうすれば良いでしょうか。
回答: `fs.readFile`は**非同期処理**です。 非同期処理を簡単に表現すると、ファイルを読み込んだ後に`function(err, buf){/*中身*/}`の中身を実行しますが、`fs.readFile(中略...});`以下の後続の処理は**ファイル読込が完了する前に実行します。** そのため`console.log(flg)`に`fs.readFile`の処理を反映させたい場合は、以下の対応をご検討ください。 * 推奨][`fs.readFileSync`を使って同期処理に書き換える * `fs.readFile`の中に`console.log(flg)`を記述する **サンプルコード** ``` const fs = require("fs"); // 非同期処理 let flg = false; fs.readFile("no_file_exists.txt", function(err, buf){ // 存在しないファイルを読み込むとエラーになる if(err) { flg=true; } // 非同期処理なのでここで読み込む console.log(flg); }); // 同期処理 flg = false; try { // 存在しないファイルを読み込むとエラーになる fs.readFileSync("no_file_exists.txt"); } catch(err) { flg=true; // エラーチェックはtry-catch節で行う } console.log(flg); ``` **参考資料** * node.jsでファイルの入出力操作 * How to capture no file for fs.readFileSync()?