NodeJS возврат не останавливая всю функцию - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть функция, enter , которая содержит две функции fs.readFile внутри и во внутреннем файле чтения. Я проверяю, содержит ли txt-файл определенное ключевое слово, и если это так, то должно остановка всей функции enter .

Она выглядит как функция enter :

async function enter(email, firstName, lastName){

  fs.readFile(fileName, function(err, data){
    parsedData = JSON.parse(data);

    email = parsedData.email;

    fs.readFile('./anotherfile.txt', function (err, data) {
      if (err) throw err;
      if(data.includes(email)){
        console.log('Stopping function');
        return;
      }
    });
  });

  console.log('Continuing with function');
}

Проблема в том, что когда anotherfile.txt содержит ключевое слово, оно не останавливает всю функцию, оно продолжает и записывает «Продолжение с функцией», как показано в приведенном выше коде.

Любая помощь приветствуется!

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

fs обещания доступны Node v11.0.0 или Вы можете конвертировать следующим образом const readFile = util.promisify(fs.readFile);

const fsp = require('fs').promises;

async function enter(email, firstName, lastName) {

    try {
        let data = await fsp.readFile(fileName)
        let parsedData = JSON.parse(data);
        let email = parsedData.email;
        data = await fsp.readFile('./anotherfile.txt')

        if (data.includes(email)) {
            console.log('Stopping function');
            return;
        }


        console.log('Continuing with function');


    } catch (err) {
        throw err
    }
}
0 голосов
/ 25 февраля 2020

Это из-за двух вещей.

  • Вы используете асинхронное чтение файла, то есть поток кода не остановится при вызове этого readFile. Вместо этого программа продолжит работать в обычном режиме. И когда операция чтения файла будет завершена, указанная вами функция обратного вызова будет вызвана с соответствующей ошибкой или данными.

  • Оператор возврата находится внутри функции обратного вызова, следовательно, он будет только повлиять на эту функцию.

Вам необходимо использовать await, когда вы имеете дело с асинхронными функциями. Посмотри сюда здесь

...