异步节点文件创建

时间:2018-09-29 17:03:13

标签: node.js file asynchronous

我正在尝试检查文件是否存在,如果不存在,请创建文件。

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对控制台日志的打印顺序混乱的解释是什么?

3 个答案:

答案 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文本