Создание файла асинхронного узла - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь проверить, существует ли файл, и если нет, создайте файл.

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...");
        }
    }

Я, очевидно, очень плохо знаком с узлом.Некоторое время я работал в 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 голосов
/ 29 сентября 2018

Хорошо.В вашей основной функции у вас есть два console.logs.

console.log("Checking that the file exists."); находится внутри функции обратного вызова.e

Но

console.log("File does not exist. Creating a new file..."); 

находится внутри блока if.так что он выстрелил первым

0 голосов
/ 29 сентября 2018

Поскольку код 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');

В приведенном выше коде синхронного программирования выполнение будет идти строка за строкой.Для записи текста third.выполнение будет ждать 2 секунды, но при неблокирующем программировании (асинхронном) текст Fourth будет напечатан до выполнения console.log('third');

0 голосов
/ 29 сентября 2018

В вашем случае вызывается метод fs.readFile().Он ждет завершения ввода-вывода.Однако метод 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(), если он делает что-то асинхронным образом, скажем, IO, тогда 2() будет выполнено до завершения 1(), и, следовательно, вы увидите, что асинхронные методы принимают обратный вызов, который будет выполнен после завершения соответствующей функции.

Рекомендую посмотреть, как работает Nodes Event loop .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...