非同期コードを処理する際にいくつかのエラーがあります。 fs.readir()
とfs.writeFile()
は両方とも非同期です。つまり、コールバック内には、実行されたことがわかっている唯一の方法があります。
fs.readdir(dir, function(err, files) {
if (err) return console.log(err);
let length = files.length + 1;
fs.writeFile('/public/images/value.txt', length, function(err) {
if(err) return console.log(err);
console.log("The file was saved!");
console.log(length);
});
});
// fs.readdir() has not yet completed when this part of your code runs
// it will complete some time late and then call its callback
// similarly fs.writeFile() has not yet completed when this part of your code runs
あなたがfs.readdir()
の結果を使用したいのであれば、あなたは、コールバックの内側にそれを使用する必要があります。 fs.writeFile()
がいつ実行されたかを知りたいし、その存在を確信して最新のものにしたい場合は、そのコールバックでのみ行うことができます。
さらに、setTimeout()
はブロックしません。それはあなたのコードの残りの部分が実行されている間、いつか将来、いつか起動するタイマーをスケジュールすることだけです。したがって、ここでsetTimeout()
を使用する場合は、setTimeout()
コールバック内にfs.writeFile()
コードを挿入する必要があります。しかし、それはハックであり、非同期コードを処理するための推奨された方法ではありません。 fs.writeFile()
をコールバックfs.readdir()
の中に入れるだけで、100%信頼できるものになります。
非同期操作の完了を示す実際のコールバック内、またはそのコールバック内から呼び出す関数内で非同期結果を使用する必要があります。
'readdir'と' writeFile'は非同期関数です。 readdirのコールバックの中に 'fs.writeFile'を入れるか、または約束して解決する必要があります。問題は 'writeFile'が' readdir'が終了する前に呼び出されていることです。いいえ、setTimeoutはそれを止める良い方法ではありません。 –
ここでは、node.jsの非同期性を開始するのに役立つ非同期プログラミングに関する記事です:https://stackoverflow.com/documentation/node.js/8813/asynchronous-programming#t=201706221520109316922 – forrert