Как протолкнуть строки из Line Reader в массив? - PullRequest
0 голосов
/ 30 января 2019

Я озадачен этой проблемой.Я пытаюсь выдвинуть объект, содержащий подстроки каждой строки текстового файла, в массив вне области читателя fs.Я почти уверен, что мой массив находится в правильной области видимости, но мой массив всегда выходит пустым.

Код работает без ошибок, я даже могу распечатать каждую строку из текстового файла без проблем.

Я пытаюсь использовать Node, чтобы получить строки из текстового файла журнала и перенести отдельные части каждой строки в БД.

var watcher = chokidar.watch("MyFolder", {ignored: /^\./, persistent: true});
watcher
  .on('add', function(path) {
    var myArray = [];
    console.log('File', path, 'has been added');
    var lineReader = require('readline').createInterface({
      input: require('fs').createReadStream(path)
    });
    lineReader.on('line', function (l) {
      l.toString();   
      myArray.push({
        "date" : l.substring(25,35),
        "time" : l.substring(35,46)
       });
    });
    console.log(myArray); //Always empty
  })
  .on('change', function(path) {console.log('File', path, 'has been changed');})
  .on('unlink', function(path) {console.log('File', path, 'has been removed');})
  .on('error', function(error) {console.log('Error happened', error);});

Я ожидаю, что консоль покажет мне массив, но он всегда пуст.

1 Ответ

0 голосов
/ 30 января 2019

Причина, по которой вы получаете пустой массив, заключается в том, что ReadLine добавляет обратный вызов в IO event queue, и он будет выполнен после завершения текущего выполнения сценария.Так что похоже на определение массива и его печать на следующей строке.Чтобы напечатать все значения в массиве, вам просто нужно добавить еще одного слушателя в lineReader ReadLine object для события close.

Ниже приведен обновленный код с событием close.

var watcher = chokidar.watch("MyFolder", {ignored: /^\./, persistent: true});
watcher
  .on('add', function(path) {
    var myArray = [];
    console.log('File', path, 'has been added');
    var lineReader = require('readline').createInterface({
      input: require('fs').createReadStream(path)
    });
    lineReader.on('line', function (l) {
      l.toString();   
      myArray.push({
        "date" : l.substring(25,35),
        "time" : l.substring(35,46)
       });
    });

    lineReader.on('close', function () {
      console.log(myArray);
    })

  })
  .on('change', function(path) {console.log('File', path, 'has been changed');})
  .on('unlink', function(path) {console.log('File', path, 'has been removed');})
  .on('error', function(error) {console.log('Error happened', error);});
...