asynchronous读取和cachingnodejs中的多个文件

我有一个数组保持几个文件的URL。 例如:

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

我需要asynchronous读取它们并将它们保存在名为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”会起作用,并且会失去范围。 有没有办法解决这个或另一种方法来读取数组中的文件并caching它们?

当您执行readFilecallback时,for循环已经完成。 所以ifiles.lengthfiles[i]将是undefined 。 为了缓解这个问题,你需要将variables封装在闭包中。 最简单的方法是创build一个你的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]); } 

为了更好的执行控制,你可能想看看asynchronous :

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

编辑:使用助手function作为asynchronous的例子。

现有的答案不适合我。 我确实find了一个N​​PM软件包来完成这个工作: https : //www.npmjs.com/package/read-multiple-files 。 在npm install 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); });