2017-06-22 15 views
0

私はnode.jsを使用していますが、フォルダを読み込み、file.lengthを返そうとしています。その後、値をtxtファイルに書き込みたいと思います。問題は、fs.writeFileを使用しようとすると、世界だけを含むファイルが作成されるということです。は未定義ですです。fs.writeFileを使用したときに未定義の値

var length; 
fs.readdir(dir, function(err, file) { 
    length = file.length+1; 
}); 
setTimeout(function(){ 
}, 1000); 
fs.writeFile('/public/images/value.txt', length, function(err) { 
    if(err) { 
     return console.log(err); 
     } 

    console.log("The file was saved!"); 
    console.log(length); 
}); 

にconsole.log(長さ)you're非同期コードを扱う6

+1

'readdir'と' writeFile'は非同期関数です。 readdirのコールバックの中に 'fs.writeFile'を入れるか、または約束して解決する必要があります。問題は 'writeFile'が' readdir'が終了する前に呼び出されていることです。いいえ、setTimeoutはそれを止める良い方法ではありません。 –

+0

ここでは、node.jsの非同期性を開始するのに役立つ非同期プログラミングに関する記事です:https://stackoverflow.com/documentation/node.js/8813/asynchronous-programming#t=201706221520109316922 – forrert

答えて

0

非同期コードを処理する際にいくつかのエラーがあります。 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%信頼できるものになります。

非同期操作の完了を示す実際のコールバック内、またはそのコールバック内から呼び出す関数内で非同期結果を使用する必要があります。

+0

@ george.angelop - これはあなたの質問に答えましたか? – jfriend00

+0

あなたは最高です –

0

この典型的なエラーを返します。あなたが定義されていない理由は、最初の関数がfs.writefile関数が実行されたときにディレクトリの読み込みを完了していないためです。したがって、この時点では長さは未定義です。 setTimeout関数の中にwritefile関数を入れてみてください。これはそれを作るはずです。

+0

私はそれを試みたが、それは仕事をしなかった。私もfs.readdir関数を削除しようとしましたが、var length = 6で置き換えました。テストするだけですが、未定義の場合と同じ問題があります。 –

+0

「厳密な使用」モードになっていますか? – Alfon

+0

"use strict"を使うかどうかは関係ありません。 –

関連する問題