我有一个数组,其中包含几个文件的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调用,然后在循环中调用该函数:
readFile
i
files.length
files[i]
undefined
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', ...] });
编辑: 异步示例使用了辅助功能。