2016-09-28 4 views
0

私は "learnyounode"を使ってnode.jsを学習しようとしています。フォルダパスとファイル拡張子タイプを入力し、そのフォルダ内のそのタイプのすべてのファイルを出力として出力するようになっているエクササイズがあります。node.jsのコールバック関数からオブジェクトを配列にプッシュできないのはなぜですか?

var fs = require('fs'); 
var pathModule = require('path'); 
var path = process.argv[2]; 
var ext = '.'.concat(process.argv[3]); 
filteredList = []; 
fs.readdir(path,function doneReading(err, list){ 
    for(var i = 0; i < list.length; i++){ 
     if(pathModule.extname(list[i]) == ext){ 
      filteredList.push(list[i]); 
     } 
    } 
    }) 

for(var i = 0; i < filteredList.length; i++){ 
    console.log(filteredList[i]); 
} 

filteredList.push(list[i]); 

がfilteredListの内容には影響しません何らかの理由:私はこのプログラムを構築しました。どうしてこれなの?私は、console.logをreaddir関数の中に移動することで、エクササイズを解決しましたが、なぜpsuhが動作しないのかわかりません。

+1

fs.readdirは非同期です:これにあなたのコードを変更してみてください –

答えて

0

機能doneReadingは、あなたがそれを待っているわけではなく、filteredListに影響します。 fs.readdir関数は、コールバックをとる非同期です。コールバックは、呼び出すメソッドが終了したときに呼び出されます。コールバックはプログラムの実行をブロックしないので、リストnullを出力します。それが正しく出力されますそのコールバック内部の出力リストをと - fs.readdirは、コールバック関数を呼び出した前にfilteredListを出力している -

fs.readdir(path,function doneReading(err, list){ 
    for(var i = 0; i < list.length; i++){ 
     if(pathModule.extname(list[i]) == ext){ 
      filteredList.push(list[i]); 
     } 
    } 
    for(var i = 0; i < filteredList.length; i++){ 
     console.log(filteredList[i]); 
    } 
}) 
関連する問題