我正在使用node.js,我正在尝试读取文件夹并返回file.length,然后我想在txt文件上写入值。问题是,当我尝试使用fs.writeFile时,它会创建一个仅包含 undefined 世界的文件。
var length;
fs.readdir(dir, function(err, file) {
length = file.length+1;
});
setTimeout(function(){
}, 1000);
fs.writeFile('/public/images/value.txt', length, function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
console.log(length);
});
console.log(length)返回6
答案 0 :(得分:2)
您在处理异步代码时遇到一些错误。 fs.readir()
和fs.writeFile()
都是异步的。这意味着,你知道它们完成的唯一方法就是回调。
fs.readdir(dir, function(err, files) {
if (err) return console.log(err);
let length = files.length + 1;
fs.writeFile('/public/images/value.txt', length, function(err) {
if(err) return console.log(err);
console.log("The file was saved!");
console.log(length);
});
});
// fs.readdir() has not yet completed when this part of your code runs
// it will complete some time late and then call its callback
// similarly fs.writeFile() has not yet completed when this part of your code runs
因此,如果您想使用fs.readdir()
的结果,那么您应该在回调中使用它。如果您想知道fs.writeFile()
何时完成并依赖其存在并且是最新的,那么您只能在其回调中执行此操作。
此外,setTimeout()
不会阻止。它所做的就是安排一个计时器在将来的某个时间启动,而其余代码继续运行。因此,如果您要在此处使用setTimeout()
,则必须将fs.writeFile()
代码放在setTimeout()
回调中。但是,这是一个黑客,并不是处理异步代码的推荐方法。您应该将fs.writeFile()
置于fs.readdir()
回调中,然后事情将100%可靠。
异步结果必须在实际回调中使用,表示异步操作完成或在该回调中调用的函数中。
答案 1 :(得分:0)
这是处理异步代码时的典型错误。您未定义的原因是因为第一个函数在执行fs.writefile函数时尚未完成读取目录,因此此时长度仍未定义。尝试将writefile函数放在setTimeout函数中。这应该成功。