2012-03-08 75 views
4

我有一個數組可以保存多個文件的URL。例如:異步讀取和緩存nodejs中的多個文件

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

我需要異步讀取它們並將它們保存在名爲cache(cache = {})的對象中。 要做到這一點,我使用的代碼:

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

我到底有結果:

cache = { undefined : 'File 3 content' } 

我也明白,在循環後的「READFILE」行動結束,並失去它的範圍。有沒有辦法解決這個或另一種方法來讀取數組中的文件並緩存它們?

回答

16

當您執行readFile的回調時,for循環已經完成。所以i將是files.lengthfiles[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 2012-03-08 13:25:40

+0

,但我需要通過「utf-8」作爲參數傳遞給ReadFile函數,我應該怎麼做這個? – jeroen 2013-07-22 14:35:05

+1

@jeroen:您需要創建一個通過'utf8'的幫助函數。類似於:'function read(file,callback){fs.readFile(file,'utf8',callback)}'。 *編輯*:查看編輯過的帖子! – 2013-07-23 16:12:49

0

現有的答案不適合我。我確實找到了一個N​​PM軟件包來完成這項工作:https://www.npmjs.com/package/read-multiple-filesnpm 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); 

});