【问题标题】:Node.js Readline Interface 'pause' event does not pause input streamNode.js Readline Interface 'pause' 事件不会暂停输入流
【发布时间】:2014-09-12 03:44:54
【问题描述】:

我希望下面的代码创建一个 Readline 接口,该接口具有来自具有约 1000 个 URL 列表的文件的可读流,从输入流开始流式传输(将一行记录到控制台),然后暂停:

var readline = require('readline');
var fs = require('fs');

var rlinterface = readline.createInterface({
    input: fs.createReadStream('urls.txt'),
    output: null,
    terminal: false
});

rlinterface.on('pause', function() {
    console.log('Readline paused.');
});

rlinterface.on('line', function(line){
    console.log(line);
    rlinterface.pause();
}); 

pause 事件的侦听器通知我应该暂停流,但来自输入流的文件中的所有行都记录到控制台,这表明流从未暂停。即使流没有在第一行之后立即暂停(可能需要几行额外的行是captured in a buffer),我也不希望输入流中文件中的所有行都在“暂停”之前流式传输'。那到底是怎么回事?

【问题讨论】:

  • 您是否尝试过直接暂停输入流以查看行为是否相同?
  • 我确实尝试过——同样的行为。
  • 文件大小是多少?
  • 输入文件非常小,17 kB。

标签: node.js stream


【解决方案1】:

可能发生的情况是整个文件正在一次被读入,而当您pause() 时,已经没有什么可读的了。具体来说,fs.ReadStream 的默认 highWaterMark64KB,因此 Readable 流可以在第一次读取时轻松消耗整个 17KB 文件,因为它试图将内部缓冲区保持满至 highWaterMark

【讨论】:

  • 来自 NodeJS 文档:请注意,rl.pause() 不会立即暂停事件流。调用 pause 后可能会发出几个事件,包括 line。
  • @OnurYıldırım 不过,这与这种特殊情况无关。
猜你喜欢
  • 1970-01-01
  • 2021-03-30
  • 2021-11-07
  • 1970-01-01
  • 2018-09-23
  • 2018-11-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
相关资源
最近更新 更多