Узел и Ленивый: Как я узнаю, когда это будет сделано?
Мне нужно прочитать файл построчно, и соответственно изменить переменную. Я обычно писал бы это на 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
,