2011-12-30 17 views
6

Dosya adları içeren bir dizi üzerinde yinelemiyorum. Her biri için readFile()'u çağırıyorum. Karşılık gelen geri çağrı çalıştırıldığında, parametre olarak readFile()'a iletilen dosya adını almak istiyorum. Bu yapılabilir mi?NodeJS readFile() dosya adını döndürür

Niyetimi daha iyi açıklamak için snipped kodu eklenmiştir.

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

altındaki tüm çözümler kontrol ediniz. her biri doğru. – MrIzik

cevap

6

Ayrıca yerine for döngünün forEach kullanabilirsiniz:

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

Bu en basit, okunaklı ve en doğru cevap! – TooTallNate

+0

Bu doğru, ancak ön işleme gerek duyulduğunda bazı sınırlamalara sahip. – MrIzik

7

Sen yapabileceği bir kapatma kullanarak:

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])); 
} 

Şimdi her dosya adı işlevin parametre olarak kaydedilir ve iterasyon devam döngü tarafından etkilenmeyecektir.

0

Bağımsız değişken eklemek için Function.prototype.bind'u da kullanabilirsiniz. bind, çağrıldığında, özgün işlevi ilk argüman olarak [index] dosyaları ile çağırır.

Fakat bunun iyi bir yol olup olmadığı konusunda hiçbir fikriniz yok.

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

'Fonksiyon # bind()' bu durumda tamamen gereksiz ve sadece bir performans cezası. Bu durumda her döngü yinelemesi için yeni bir kapatmaya ihtiyacınız var. @danmactough'un önerdiği gibi, Array # forEach() 'ın kullanılması benim düşünceme göre" en temiz "yoldur. – TooTallNate

+0

Gözlerimi açtığınız için teşekkürler – MrIzik

İlgili konular