【问题标题】:NodeJS - readline pause and resume event emitter (read line by line)NodeJS - readline 暂停和恢复事件发射器(逐行读取)
【发布时间】:2012-09-16 13:45:21
【问题描述】:

我正在使用 Node v.0.8.9 及其模块 readline。我无法使用fs.readFile(),因为我收到EISDIR 错误。

我想从文件中逐行读取,做一些工作,然后(当工作完成时)读取下一行。因此,我尝试了以下 sn-p(见下文),但是当使用一些同步工作更改 for 时,它不会同步运行。

var fs = require('fs');
var readline = require("readline");
var filename = process.argv[2];

readline.createInterface({
    input: fs.createReadStream(filename),
    terminal: false
}).on("line", function(line){
   this.emit("pause", line);
}).on("pause", function(line) {
    console.log("pause");
    console.log(line);
    console.log("doing some work");
    for (var i = 0; i < 1000000000; ++i);
    this.emit("resume");
}).on("resume", function() {
    console.log("resume");
}).on("close", function() {
    console.log("close");
});

有人能解释一下这个问题吗?

【问题讨论】:

  • 该错误表明您正在尝试从目录中读取。
  • @IoannisKaradimas,不。我已经验证过了。这是因为文件太大而发生的。
  • 您应该更新您的问题以反映这一点,以避免与我的评论类似的回复。另外,如果您指出文件的大小,那会很好,以防它是基于操作系统的限制或类似的东西。

标签: javascript node.js


【解决方案1】:

虽然从文件中逐行读取是很常见的,但 NodeJS 并没有支持这种大文件的实现。因此,您需要使用缓冲区来实现它。

这是一个很好用的 - http://blog.jaeckel.com/2010/03/i-tried-to-find-example-on-using-node.html

【讨论】:

  • 我不同意 :-) node 的readline 模块有两种方法在处理大文件时很有帮助:pauseresume。如果您不想自己调用它们,您可以使用类似缓冲数据接收器的东西:npmjs.com/package/buffered-data-sink。它缓冲数据并在队列已满时暂停阅读器。您只需要设置缓冲区大小和队列限制。
【解决方案2】:

只是预感....尝试实际调用pause() 而不是发出pause 事件。

即改变:

this.emit("pause", line);

到...

this.pause();

让我知道这是否有效。

【讨论】:

  • 首先,我不能使用它,因为我必须传递一个参数。但即使我解决了争论的问题,它的行为方式也是一样的。
猜你喜欢
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多