在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.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', ...]
);

编辑:将辅助函数用于异步示例。

【讨论】:

我正在使用异步,但我需要将 '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中异步读取和缓存多个文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在从 NodeJS 中的多个输入流中读取时写入单个文件

javascript 与nodejs core lib异步读取json文件

nodeJS文件流和事件

如何优雅的处理Nodejs中的异步回调

nodejs 文件系统

NodeJS fs - 无法读取外部json文件[重复]