2011-12-30 4 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

이 경우'Function # bind()'는 완전히 불필요하며 성능상의 불이익입니다. 이 경우 루프 반복마다 새 closure가 필요합니다. @danmactough와 같이'Array # forEach()'를 사용하면 내 생각에 "가장 깨끗한"방법입니다. – TooTallNate

+0

내 눈을 열어 주셔서 감사합니다 – MrIzik