【问题标题】:How do I use readline in Node.js to get all input lines into an array?如何在 Node.js 中使用 readline 将所有输入行放入数组中?
【发布时间】:2017-05-19 10:45:58
【问题描述】:

为了 CodeAbbey 的目的,我想创建一个方便的函数来执行类似的操作:

var rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

var lines = [];

rl.on('line', (line) => {
  lines.push(line);
});

return lines;

但是,由于readline 作为事件处理程序的功能,我得到的当然是一个空数组。

如何让 readline 在这里执行所需的行为?还是我使用其他库?我宁愿只使用“默认”组件,但如果我必须使用其他东西,我会。

【问题讨论】:

    标签: javascript node.js io


    【解决方案1】:

    您需要在关闭事件时访问行数组:

    var readline = require('readline');
    
    var rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    });
    
    var lines = [];
    
    rl.on('line', (line) => {
      lines.push(line);
    });
    
    rl.on('close', () => {
      console.log(lines);
    });
    

    这段代码将建立createInterface,并初始化一个空数组lines。在提示符下,当用户按下回车键时,它会触发“line”事件并将先前写入的行添加到行数组中。当您关闭界面(通过终止进程或手动关闭代码)时,它将注销数组。

    $ node readlines.js
    this is
    the second line
    third
    [ 'this is', 'the second line', 'third' ]
    

    【讨论】:

    • 我无法从 close 事件中的函数返回行
    • 返回行是什么意思?这个的预期用例是什么?
    • 它的目的是在一个没有参数的函数中,我将通过 CommonJS 模块访问它,但我省略了它,因为它不是最相关的部分
    • 您希望函数何时返回?由于 readline 是基于事件的,因此您必须告诉它何时完成/关闭
    • 我希望函数在所有行都在数组中时返回
    【解决方案2】:
    var lines = [];
    
    rl.on('line', (line) => {
      lines.push(line);
    }).on('close', () => {
      // Do what you need to do with lines here
      process.exit(0);
    });
    

    由于Node.js 在事件循环上运行,许多包中可用的许多功能,包括Readline,都是异步的。一般来说,当close 事件被触发时,您需要处理lines

    您可能会发现这个非常相似的已解决问题很有帮助: node.js: read a text file into an array. (Each line an item in the array.)

    希望这会有所帮助!

    【讨论】:

    • 现在我们从那个链接的问题开始。将fs.readFileSync('file.txt').toString().split("\n"); 转换为标准输入的最佳实践?
    • 使用 process.exit(0) 仍然是空的。我认为唯一的方法是返回一个承诺或使用 fs split?!
    • 请注意,您不能使用'close'事件来表示所有数据都已处理完毕。可以在close事件之后调用line事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 2016-08-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多