Node.js : Есть ли способ остановить чтение файла и всего процесса в функции eachLine для чтения строк?

#javascript #node.js #loops

Вопрос:

У меня есть этот код:

 const lineReader = require('line-reader');

var truevar = false;

async function readLines(filename, processLine) {
    return new Promise((resolve, reject) => {
        lineReader.eachLine(filename, (line, last, callback) => { 
           if (!callback) throw new Error('panic');
               if (truevar) {
                   // I wanna stop/finish the function here
               } else {
                   processLine(line)
                   .then(() => last ? resolve() : callback())
                   .catch(reject);
               };
           });
       })
   };
 

И вот как я вызываю функцию readLines:

 await readLines('somefile.txt', async (line) => {
    await delay(1000) // 1 second
    other_function(line);
});
 

Мне нужно прекратить чтение файла и завершить весь процесс, как только он дойдет до определенной точки. Я прочитал документы для чтения строк, но ничего не нашел. Я также пытался сделать это грязным способом с помощью «break;» и т. Д., Но, Очевидно, это просто не завершит работу и застрянет (не может вызвать его снова, пока я не перезагружу программу), так что это бесполезно.

РЕДАКТИРОВАТЬ: исправлена проблема. Я забыл вернуть значение truevar обратно в false, чтобы иметь возможность снова вызвать функцию.

Ответ №1:

Попробуйте это:

 lineReader.eachLine(filename, (line, last, callback) => { 
  if (!callback) throw new Error('panic');
  if (truevar) {

    // Add to stop reading
    cb(false);        

  } else {
    processLine(line)
      .then(() => last ? resolve() : callback())
      .catch(reject);
  };
});
 

Источник: https://www.npmjs.com/package/line-reader

Комментарии:

1. Уже пробовал это. Не выполняет задание, потому что это приводит к зависанию асинхронной задачи, и сценарий ожидает завершения функции навсегда (как я предполагаю), потому что я не могу снова вызвать ту же функцию, пока не закрою программу.

Ответ №2:

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