当前位置: 首页 > 面试题库 >

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

洪楚
2023-03-14
问题内容

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


问题答案:

当您的要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', ...]
});

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



 类似资料:
  • 问题内容: 我正在编写一个简单的请求处理程序以返回一对CSS文件。使用fs.readFileSync,这很容易。但是,我很难使用异步版本的readFile完成相同的任务。下面是我的代码。将我的response.write()方法调用拆分到两个不同的回调中似乎是有问题的。有人可以指出我做错了什么吗?有趣的是,如果我将response.end()放在第一个else语句中,则此代码有效。但是,这产生了一

  • 问题内容: 我对在Node.js中读取文件感到很困惑。 文件与尝试打开并读取文件的文件位于同一目录中。 但是,在控制台中,我得到: {[错误:ENOENT,打开’./start.html’]错误号:34,代码:’ENOENT’,路径:’./ start.html’} 有任何想法吗? 问题答案: 使用; 多亏了dc5。

  • 我想读取一个文件,并使用FileReader对象将其转换为base64编码的字符串。以下是我使用的代码: 但是在这种情况下,我在事件处理程序(onLoadend事件)中得到转换的结果。我想要一个同步方法。有没有办法"readAsDataURL"方法可以直接返回'result_base64'变量的值?

  • 我试图写一个异步函数,使多个读取,等待所有完成,然后返回JSON结果作为一个数组。这是我到目前为止所拥有的: 文件1。js 应用程序编程接口。js util.js 当执行在调试器处暂停时,我使用Chrome的开发工具检查,它正确地是由3个对象组成的数组,但如果我检查,它奇怪地在控制台中返回一个

  • 问题内容: 我是这个Node.js的新手..我对此回调有点困惑..在我的应用程序中,我在for循环内调用异步函数调用,我想我的问题是在得到异步调用响应之前, for循环被循环。 我的代码: 搜索功能代码: 我想在成功执行1个搜索功能后执行for循环,我想我必须使用async for loop。请指导我解决此问题。 问题答案: 我将您的代码示例简化为以下几行,以使您更容易理解该概念。 先前代码的问题

  • 异步文件读写 读文件 use AsyncFile; $content = (yield AsyncFile::read(__ROOT__."runtime/test.txt")); 写文件 $res = (yield AsyncFile::write(__ROOT__."runtime/test.txt", "hello wordls!")); $res = (yi