一尘不染

在Node.js中异步读取和缓存多个文件

node.js

我有一个数组,其中包含几个文件的URL。例如:

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”在循环结束后起作用,并且失去了作用域。有没有一种方法可以解决此问题,或者有另一种方法可以从数组中读取文件并对其进行缓存?


阅读 332

收藏
2020-07-07

共1个答案

一尘不染

当您的要readFile执行的回调执行时,for循环将已经完成。所以ifiles.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', ...]
});

编辑: 异步示例使用了辅助功能。

2020-07-07