我有一个数组,其中包含几个文件的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循环将已经完成。所以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', ...]
});
编辑: 异步示例使用了辅助功能。
问题内容: 我正在编写一个简单的请求处理程序以返回一对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个对象组成的数组,但如果我检查,它奇怪地在控制台中返回一个
异步文件读写 读文件 use AsyncFile; $content = (yield AsyncFile::read(__ROOT__."runtime/test.txt")); 写文件 $res = (yield AsyncFile::write(__ROOT__."runtime/test.txt", "hello wordls!")); $res = (yi
问题内容: 我是这个Node.js的新手..我对此回调有点困惑..在我的应用程序中,我在for循环内调用异步函数调用,我想我的问题是在得到异步调用响应之前, for循环被循环。 我的代码: 搜索功能代码: 我想在成功执行1个搜索功能后执行for循环,我想我必须使用async for loop。请指导我解决此问题。 问题答案: 我将您的代码示例简化为以下几行,以使您更容易理解该概念。 先前代码的问题