Сохранить массив из модуля readline - PullRequest
0 голосов
/ 11 марта 2020

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

const fs = require('fs');
const readline = require('readline');

function read_file(filename) {
   const filePath = './uploads/' + filename;
   var data = []

   data = readline.createInterface({
      input: fs.createReadStream(filePath),
      terminal: false
   }).on('line', function (
      data.push(line);
      console.log(data); // Here the array is filling well
   });

   console.log(data); // Buy here is empty again
}

1 Ответ

0 голосов
/ 11 марта 2020

Это из-за асинхронной архитектуры Node.js, ваш console.log выполняется перед задачей чтения файла.

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

Что-то вроде этого может вам помочь:

const fs = require('fs');
const readline = require('readline');

async function read_file(filename) {
  const filePath = './uploads/' + filename;
  var readData = [];

  let data = await new Promise((resolve, reject) => {
    try {
      readline.createInterface({
        input: fs.createReadStream(filePath),
        terminal: false
      })
        .on('line', function (line) {
          readData.push(line);
        })
        .on('close', function() {
          resolve(readData);
        });
      }
      catch(e) {
       reject(e);
      }
   });

 console.log(data);
}
...