在nodejs中异步读取和缓存多个文件
Posted
技术标签:
【中文标题】在nodejs中异步读取和缓存多个文件【英文标题】:Asynchronously reading and caching multiple files in nodejs 【发布时间】:2012-03-25 23:08:52 【问题描述】:我有一个数组来保存几个文件的 URL。例如:
var files = ['1.html', '2.html', '3.html'];
我需要异步读取它们并将它们保存在名为缓存 (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”在循环结束后起作用并且它失去了它的范围。有没有办法修复这个或其他方法来从数组中读取文件并缓存它们?
【问题讨论】:
【参考方案1】:当您对readFile
的回调执行时,for 循环已经完成。所以i
将是files.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', ...]
);
编辑:将辅助函数用于异步示例。
【讨论】:
我正在使用异步,但我需要将 'utf8' 作为参数传递给 readFile 函数,我该怎么做? @jeroen:您需要创建一个传递“utf8”的辅助函数。类似:function read(file, callback) fs.readFile(file, 'utf8', callback)
。 编辑:查看编辑后的帖子!【参考方案2】:
现有的答案对我不起作用。我确实找到了一个可以完成这项工作的 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);
);
【讨论】:
以上是关于在nodejs中异步读取和缓存多个文件的主要内容,如果未能解决你的问题,请参考以下文章