Узел и Ленивый: Как я узнаю, когда это будет сделано?

Мне нужно прочитать файл построчно, и соответственно изменить переменную. Я обычно писал бы это на PHP... но я решил принять вызов.

Я написал:

fs = require('fs');
Lazy = require('lazy');
path = require('path');

files = fs.readdirSync('.');
var software = {};


files.forEach( function(fileName){


  var m; 
  if( m = fileName.match(/^(.*)\.txt$/) ){
    name = m[1];

    console.log("Processing file: " + fileName);
    software[name] = {};
    console.log("Software 1: %j",software);

    var section = 'unset';
    new Lazy(fs.createReadStream(fileName)).lines.forEach(
      function(line){
        var m;
        line = line + '';
        if( m = line.match(/^([a-zA-Z_]*):$/)){
          section = m[1];
          software[name][section] = '';
          console.log("Switching to section " + m[1]);
          console.log("Software 2: %j",software);
        } else if (line == '.'){
          section = 'unset'
        } else if (line == ''){
          section = 'unset'
        } else { 
          console.log("LINE: " + line) ;
          software[name][section] = software[name][section] + line + "\n";
          console.log("Software 3: %j",software);
        }
      }

    );   
  }

});

console.log("Software 4: %j",software);

Помимо того, что код очень уродливый и неоптимизированный, у меня возникают проблемы, так как при печати последней строки переменная "software" не заполняется YET! Я предполагаю, что Ленивый асинхронен. Так что это в принципе работает, но "в какой-то момент позже". Это здорово, но... где я могу написать код, когда тот важный цикл, который заполняет программную переменную, фактически завершен?!?

По запросу: данные для игры!

просто создайте "thing.txt"и напишите:

name:
Name 1
.

Option 1:
Value 1
.

Option 2:
Value 2
.

Option 3:
Multi
Line
Value
.

Another_section:
Again
.

Merc.

1 ответ

Решение

Экземпляры Lazy, возвращаемые библиотекой, являются EventEmitters, и она генерирует событие, называемое pipe когда "набор" операций завершен:

new Lazy(
  ...
).on('pipe', function() {
  // all done
});

Изменение вашего кода для использования этого события приводит к (единственное изменение в нижней части):

fs = require('fs');
Lazy = require('lazy');
path = require('path');

files = fs.readdirSync('.');
var software = {};


files.forEach( function(fileName){


  var m;
  if( m = fileName.match(/^(.*)\.txt$/) ){
    name = m[1];

    console.log("Processing file: " + fileName);
    software[name] = {};
    console.log("Software 1: %j",software);

    var section = 'unset';
    new Lazy(fs.createReadStream(fileName)).lines.forEach(
      function(line){
        var m;
        line = line + '';
        if( m = line.match(/^([a-zA-Z_]*):$/)){
          section = m[1];
          software[name][section] = '';
          console.log("Switching to section " + m[1]);
          console.log("Software 2: %j",software);
        } else if (line == '.'){
          section = 'unset'
        } else if (line == ''){
          section = 'unset'
        } else {
          console.log("LINE: " + line) ;
          software[name][section] = software[name][section] + line + "\n";
          console.log("Software 3: %j",software);
        }
      }

    ).on('pipe', function() {
      console.log("Software 4: %j",software);
    });
  }

});

[Изменить] Чтобы ответить на ваш вопрос относительно того, как я нашел эту информацию:

Я действительно проверил исходный файл для проекта; Я знал, что в библиотеке был sum метод, который можно связать с примерами Lazy, чтобы подвести итоги в конце; код для вызова этого метода foldr и код этого метода прослушивает событие с именем pipeName по умолчанию в строке 22 pipe,

Другие вопросы по тегам