节点和懒惰:我怎么知道什么时候完成?

我需要逐行读取文件,并相应地更改一个variables。 我通常会用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); 

除了代码非常难看,非常不优化之外,当最后一行打印时,我遇到了麻烦,“软件”variables没有被填充! 我猜懒惰是asynchronous的。 所以,它基本上是有效的,但是“稍后”。 这很好,但是…当重要的循环填充软件variables时,我在哪里编写代码实际上已经完成了?

按照要求:数据来玩!

只需创build“something.txt”并写入:

 name: Name 1 . Option 1: Value 1 . Option 2: Value 2 . Option 3: Multi Line Value . Another_section: Again . 

芝加哥商业交易所。

库返回的Lazy实例是EventEmitters ,当一组操作完成时,它会发出名为pipe en事件:

 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); }); } }); 

[编辑]为了回答你关于我如何find这个信息的问题:

我确实检查了项目的源文件 ; 我知道图书馆有一个sum方法,可以链接到懒惰的例子总结一切在最后; 该方法的代码调用foldr , 该方法的代码监听名为pipeName的事件,该事件在第22行默认为pipe

Interesting Posts