我是javascript的新手。这是我的代码
......
var filename, result, user=["a", "b", "c","d"];
for(var p=0;p<user.length;p++)
{
filename=userID[p]+'_'+user[p]+'.json';
fs.readFile(filename, function read(err, data)
{
if (err) {throw err;}
result = data.toString();
if (result.charAt(result.length-1) === ',')
result = result.substring(0,result.length-1) + ']}';
console.log(p+filename+result+"\n\n"); //here
});
}
在“here”中,p的值总是显示最后一个索引,在这种情况下,对于所有迭代,3的输入也是最后一次迭代的文件名。如何在“here”中获得正确的p值。对于p,我的编译器显示“可以从闭包中访问可变变量”。
答案 0 :(得分:1)
@naomik评论似乎是正确的循环体中的任何异步作业总是坏主意。因为循环不会等到响应。
var filename, result, user=["a", "b", "c","d"];
var p=0;
function readfileUnitil(p)
{
filename=userID[p]+'_'+user[p]+'.json';
fs.readFile(filename,function(err, data)
{
if (err) {throw err;}
result = data.toString();
if (result.charAt(result.length-1) === ',')
result = result.substring(0,result.length-1) + ']}';
console.log(p+filename+result+"\n\n"); //here
if(p<user.length){
p++;
readfileUnitil(p);
}
});
}
}
我更喜欢这种递归而不是变量,因为这更具可读性,浏览器不会保留内存,希望有所帮助。
答案 1 :(得分:1)
在这种情况下,filename
的范围为for loop
阻止,filename
值已绑定到fs.readFile
。解决此问题的简单方法,请遵循区块代码
var filename, result, user = ["a", "b", "c", "d"];
for (var p = 0; p < user.length; p++) {
filename = userID[p] + '_' + user[p] + '.json';
(function(file) {
fs.readFile(filename, function read(err, data) {
if (err) {
throw err;
}
result = data.toString();
if (result.charAt(result.length - 1) === ',')
result = result.substring(0, result.length - 1) + ']}';
console.log(p + filename + result + "\n\n"); //here
});
})(filename)
}