2012-03-08 6 views
4

여러 파일의 URL을 유지하는 배열이 있습니다. 예 :노드에서 여러 파일 비동기 읽기 및 캐싱

var files = ['1.html', '2.html', '3.html']; 

비동기 적으로 읽고 캐시 (cache = {})라는 개체에 저장해야합니다. 이 범위의 내가 루프 후 "ReadFile을"행위가 종료되는 것을 이해한다

cache = { undefined : 'File 3 content' } 

하고 푼다 : 나는 결과를

for(var i = 0; i < files.length; i++){ 
    require('fs').readFile(files[i], 'utf8', function (error,data) { 
     cache[files[i]]=data; 
    }); 
} 

결국 : 는이를 위해 나는 코드를 사용 . 이 방법이나 다른 방법으로 배열의 파일을 읽고 캐시 할 수있는 방법이 있습니까?

답변

16

readFile으로 콜백을 실행하면 for 루프가 이미 완료됩니다. 따라서 ifiles.length이고 files[i]undefined이됩니다. 이것을 줄이기 위해 변수를 하나의 클로저로 묶어야합니다. 이 작업을 수행하는 가장 간단한 방법은 당신의 readFile 호출을 수행하는 함수를 작성하고, 루프에서 그것을 호출하는 것입니다 : 더 나은 실행 제어를 위해

function read(file) { 
    require('fs').readFile(file, 'utf8', function (error,data) { 
     cache[file]=data; 
    }); 
} 

for(var i = 0; i < files.length; i++){ 
    read(files[i]); 
} 

, 당신은 async로 볼 수도 있습니다 :

function readAsync(file, callback) { 
    fs.readFile(file, 'utf8', callback); 
} 

async.map(files, readAsync, function(err, results) { 
    // results = ['file 1 content', 'file 2 content', ...] 
}); 

편집 : 비동기 예제에서 도우미 함수를 사용했습니다.

+0

덕분에, 작동) – micnic

+0

내가 비동기를 사용하고는 있지만, 나는 ReadFile을 함수에 인수로 'UTF8'을 통과해야 어떻게해야 이 작업을 수행? – jeroen

+1

@jeroen : 'utf8'을 전달하는 도우미 함수를 만들어야합니다. 'function read (file, callback) {fs.readFile (file, 'utf8', callback)}'과 같은 것입니다. * 편집 * : 편집 된 게시물보기! –

0

기존 대답이 저에게 효과적이지 않았습니다. 나는 일을했던 NPM 패키지를 찾았다 : https://www.npmjs.com/package/read-multiple-files. 명령 줄에서 npm install read-multiple-files 후, 여기에 내가 사용되는 코드입니다 :

var files = ['1.html', '2.html', '3.html']; 

console.log("\n"); 

readMultipleFiles(files, 'utf8', function(err, inputFiles) { 
    if(err) { 
    console.log("Read Error: " + err); 
    } 

    fileOne = inputFiles[0]; 
    fileTwo = inputFiles[1]; 
    ... 

    console.log(fileOne); 
    console.log(fileTwo); 

});