2011-12-30 10 views
6

ファイル名を含む配列を反復処理しています。それぞれについて、私はreadFile()を呼び出します。対応するコールバックが呼び出されると、readFile()に渡されたファイル名をパラメータとして取得したいと考えています。それはできますか?NodeJS readFile()ファイル名を取得

私の意図をよりよく説明するためにコードをまとめました。

var fs = require("fs"); 
var files = ["first.txt", "second.txt"]; 
for (var index in files) { 
    fs.readFile(files[index], function(err, data) { 
     //var filename = files[index]; 
     // If I am not mistaken, readFile() is asynchronous. Hence, when its 
     // callback is invoked, files[index] may correspond to a different file. 
     // (the index had a progression). 
    }); 

} 
+0

は、以下のすべてのソリューションをご確認ください。それぞれ正しいです。 – MrIzik

答えて

6

また、代わりにforループのforEachを使用することができます。

files.forEach(function (file){ 
    fs.readFile(file, function (err, data){ 
    console.log("Reading %s...", file) 
    }) 
}) 
+0

これは最も簡単で、最も読みやすく、正しい答えです! – TooTallNate

+0

これは正しいですが、前処理が必要な場合は、いくつかの制限があります。 – MrIzik

7

あなたはクロージャを使用していることを行うことができます。

for (var index in files) { 
    (function (filename) { 
     fs.readFile(filename, function(err, data) { 
      // You can use 'filename' here as well. 
      console.log(filename); 
     }); 
    }(files[index])); 
} 

は今、すべてのファイル名は、関数のパラメータとして保存され、その繰り返しを続けるループによって影響されることはありません。

0

Function.prototype.bindを使用して引数を前に付けることもできます。 bindは、呼び出されたときにファイル[index]を最初の引数として元の関数を呼び出す新しい関数を返します。

これが良い方法であるかどうかは考えられません。

var fs = require("fs"); 
var files = {"first.txt", "second.txt"}; 
for (var index in files) { 
    fs.readFile(files[index], 
     (function(filename, err, data) { 
      //filename 
     }).bind(null, files[index]) 
    ); 

} 
+0

この場合の '関数#bind()'は完全に不要で、パフォーマンス上のペナルティです。この場合、ループの繰り返しごとに新しいクロージャが必要になります。 @danmactoughが示唆するように、 'Array#forEach()'を使うことは、私の意見では「最もクリーンな」方法です。 – TooTallNate

+0

私の目を開けてくれてありがとう – MrIzik

関連する問題