访问callback函数外的node.js中由readline&fsparsing的数据

这个问题是不同的,因为已经有一个答案。 具体来说,这段代码从node.js文档中调用,关于使用fs和readfile,并查找文件标志的结尾,我学到的是readfile.close方法。 感谢你的回答。

我在本地编写了一个小工具,试图用一个空白行将key:value对的文本文件转换成一个JSON文件,以便在React项目中使用。

我直接从node.js文档中获得了readline函数的基础。 我在我的Mac上使用节点6.9.0

这里是完整的脚本:

 const readline = require('readline'); const fs = require('fs'); const rl = readline.createInterface({ input: fs.createReadStream('usat-ncaa-programs.txt') }); var newPairs=["test"]; rl.on('line', function (line) { if (line===null){ newPairs.push("}], [ {") } else if (line) { var keyValue = line.match(/^(.*):(.*)/) var newKeyValuePair = "'" + keyValue[1].trim() + "': '" + keyValue[2].trim() + "'" newPairs.push(newKeyValuePair) //console.log (newKeyValuePair) } }) console.log(newPairs) 

input文件看起来像这样(有大约12个程序),我只包括2 1/2,所以你可以看到格式:

 University: Arizona State University Division: I University Home Page: http://www.asu.edu/ Recruiting Link: https://questionnaire.acsathletics.com/Questionnaire/Questionnaire.aspx?&SPSID=1061112&SPID=177408&DB_LANG=C&DB_OEM_ID=30300&q=2015&s=159130&o=143 Team Homepage: http://www.thesundevils.com/index.aspx?path=triathlon Head Coach: Cliff English w: 480.965.0546 e: cliff.endlish@asu.edu bg-color: #990033 color: #FFB310 University: Belmont Abby College Division: II University Home Page: http://belmontabbeycollege.edu/ Recruiting Link: https://coach.scoutforce.com/p/414f3219dd Team Homepage: http://abbeyathletics.com/sports/wtri/index Head Coach: Nick Radkewich w: 704.461.5010 e: NicholasRadewich@bac.edu Twitter: https://twitter.com/AbbeyTri bg-color: #FFFDD0 color: #DC143C University:Black Hills State University Division: II University Home Page: http://www.bhsu.edu/ ... 

我的问题是,虽然我可以逐行阅读文本文件,并parsing一些看起来像JSON文件的信息,但我无法访问callback函数外的数据。

我不知道如何将这些数据保存到一个新的文件,甚至只是输出到我的控制台的剪切和粘贴和手动编辑。

在上面的脚本中,variablesnewPairs的logging输出是[“test”],而不是我试图完成的逐行parsing。

如果我把console.log放在callback中,我会得到每次读取文件迭代时logging的信息。 我只想在文件完成时处理数据。

我没有在fsreadline的节点文档中findEOF或类似的标志。

此外,如果有更简单的方法来获取我input到JSON格式的数据,我很乐意听到。 提前致谢。

你必须明白, callback函数是asynchronous执行的。 这意味着console.log(newPairs)在callback之前被执行,因此只会导致“testing”。

您应该听取Readline的closures事件 ,如下所示:

 rl.on('close', function() { console.log(newPairs); }); 

正如文档所述:

发生以下情况时,会发出“closures”事件:

  • 调用rl.close()方法,readline.Interface实例放弃了对input和输出stream的控制;
  • inputstream接收到“结束”事件; inputstream接收到-D信号表示发送结束(EOT);
  • inputstream接收-C到信号SIGINT,并且没有在readline.Interface实例上注册的SIGINT事件侦听器。
  • 侦听器函数被调用而不传递任何参数。

readline.Interface实例应该被认为是“完成”,一旦“closures”事件发射。

所以这将是你正在寻找的'EOF':-)