使用 fs.writeFile 时未定义的值
Undefined value when using fs.writeFile
我正在使用 node.js,我正在尝试读取文件夹和 return 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) returns 6
这是处理异步代码时的典型错误。未定义的原因是因为执行 fs.writefile 函数时第一个函数尚未完成读取目录,所以此时 length 仍未定义。尝试将 writefile 函数放在 setTimeout 函数中。这应该可以。
您在处理异步代码时遇到了一些错误。 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% 可靠。
必须在表示异步操作完成的实际回调中或在您从该回调中调用的函数中使用异步结果。
我正在使用 node.js,我正在尝试读取文件夹和 return 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) returns 6
这是处理异步代码时的典型错误。未定义的原因是因为执行 fs.writefile 函数时第一个函数尚未完成读取目录,所以此时 length 仍未定义。尝试将 writefile 函数放在 setTimeout 函数中。这应该可以。
您在处理异步代码时遇到了一些错误。 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% 可靠。
必须在表示异步操作完成的实际回调中或在您从该回调中调用的函数中使用异步结果。