2012-06-20 1 views
4

Мне нужно прочитать файл по строкам и соответствующим образом изменить переменную. Обычно я пишу это на 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); 

Помимо кода быть очень некрасиво и очень unoptimised, у меня возникли проблемы, как, когда последняя строка выводит, переменная «программное обеспечение» не ПОКА заселена! Я предполагаю, что Lazy асинхронен. Таким образом, он в основном работает, но «в какой-то момент позже». Это здорово, но ... где я пишу код, когда этот важный цикл, который заполняет программную переменную, на самом деле завершен?!?

В соответствии с запросом: данные для игры!

просто создать "something.txt" и записи:

name: 
Name 1 
. 

Option 1: 
Value 1 
. 

Option 2: 
Value 2 
. 

Option 3: 
Multi 
Line 
Value 
. 

Another_section: 
Again 
. 

Merc.

+0

Хороший вопрос! Не могли бы вы дать мне несколько примеров для примера? – jsalonen

+0

Я имею в виду, что я * мог * хранить fs.createReadStream (имя_файла)). Lines.length и увеличивать счетчик для каждой строки, а затем, когда число строк достигнуто, вызовите функцию ... но это кажется совершенно сумасшедшим. ОБЯЗАТЕЛЬНО! – Merc

ответ

15

Экземпляры Лазы возвращаемые библиотеке 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); 
    }); 
    } 

}); 

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

Я действительно проверил the source file for the project; Я знал, что в библиотеке есть метод sum, который может быть привязан к экземплярам Lazy, чтобы суммировать все в конце; code for that method звонит foldr, а code for that method прослушивает событие под названием pipeName, которое по умолчанию in line 22 равно pipe.

+0

Я спрашиваю ... как вы узнали?!? Я прочитал документы Ласи и не понял этого. Там не так много с точки зрения «трубы» или «события» или «испускания» ... Я имею в виду, как вы это узнали? Вам нужно было погрузиться в исходный код? – Merc

+1

Да, я согласен, что документы не очень полные; Я предпочитаю «async» как свою библиотеку управления потоками. Я обновил свой ответ с дополнительной информацией. –

+0

КПП. Спасибо за совет. 'async' кажется действительно приятным! – jsalonen