我正在尝试检查文件是否存在,如果不存在,请创建文件。
self.checkFeedbackFile = function() {
// attempt to read the file - if it does not exist, create the file
var feedbackFile = fs.readFile('feedback.log', function (err, data) {
console.log("Checking that the file exists.");
});
if (feedbackFile === undefined) {
console.log("File does not exist. Creating a new file...");
}
}
我显然是Node的新手。在Ruby中工作了一段时间,而我对Javascript的了解很少,所以回调和异步执行的概念对我来说很陌生。
现在我的控制台返回以下内容:
File does not exist. Creating a new file...
Sat Sep 29 2018 12:59:12 GMT-0400 (Eastern Daylight Time): Node server started on 127.0.0.1:3333 ...
Checking that the file exists.
除了不确定如何执行操作外,为什么ELI5对控制台日志的打印顺序混乱的解释是什么?
答案 0 :(得分:1)
在您的情况下,将调用fs.readFile()
方法。它等待io完成。但是,checkFeedbackFile()
方法继续执行if语句。
建议您使用fs.stat检查文件是否存在。
然后fs.writeFileSync以同步方式写入文件。
self.checkFeedbackFile = function() {
// attempt to read the file - if it does not exist, create the file
fs.stat('feedback.log', function(err, data){
if(err){
console.log("File doesnt exist, creating a new file");
//Do Something
fs.writeFileSync('feedback.log',data);
}
}
}
Node.js是asycn,如果您来自C或Java,那么您将习惯于此:
function main(){
1();
2();
3();
}
在C或Java中,仅当2()
完成时,控件才会移动到1()
。取决于Node 1()
所做的事情,情况并非如此,如果Node以异步方式(例如IO)执行任何操作,则2()
将在1()
完成之前执行,因此您请参阅采用回调的异步方法,该方法将在相关功能完成后执行。
建议您看看Nodes Event loop的工作方式。
答案 1 :(得分:0)
好的。在主要功能中,您有两个console.logs。
console.log("Checking that the file exists.");
在回调内部。 e
但是
console.log("File does not exist. Creating a new file...");
只是在if块内。因此它首先被发射
答案 2 :(得分:0)
因为g++ -std=c++17 main.cpp linkedList.cpp -o main
代码取决于console.log("Checking that the file exists.");
函数的调用。您将其包装在回调中,并作为readfile
的第二个参数。一种读取文件的操作完成后,将触发回调结果。并将执行与readfile
函数处于同一级别的所有其他代码,就像readfile
函数已经完成了执行一样。调用readfile不会阻止此后所有其他代码的执行,因为您提供了一些回调,这些回调将在操作完成后执行。
此行为与同步编程的行为不同。
readfile
在上面同步编程中提供的代码中,执行将逐行执行。记录console.log('first');
console.log('second');
setTimeout(function(){
console.log('third');
}, 2000);
console.log('Fourth');
文本。执行将等待2秒钟,但在非阻塞编程(异步)中,将在执行third
之前打印Fourth
文本