何时调用_read()的节点可读流

时间:2016-07-05 13:09:36

标签: node.js stream node-streams

我创建了自己的readstream。但我想知道何时调用_read()?如果我不添加on('data') listerner,则不会调用_read()。为什么呢?

var data = [{"id":0,"name":"object 0","value":3}],
    Readable = require('stream').Readable,
    util = require('util');

var ReadStream = function() {
    Readable.call(this, {objectMode: true});
    this.data = data;
    this.curIndex = 0;
};
util.inherits(ReadStream, Readable);

ReadStream.prototype._read = function() {
    if (this.curIndex === this.data.length)
        return this.push(null);

    var data = this.data[this.curIndex++];
    //console.log('read: ' + JSON.stringify(data));
    this.push(data);
};


var stream = new ReadStream();
stream.on('data', function(record) {
    console.log('received: ' + JSON.stringify(record));
});

stream.on('end', function() {
    console.log('done111');
});

1 个答案:

答案 0 :(得分:3)

  

如果我没有添加('数据')listerner,则不会调用_read()。为什么?

流已暂停。假设您使用的是最新版本的节点。

https://nodejs.org/api/stream.html#stream_two_modes

  

所有可读流都以暂停模式开始,但可以通过以下方式之一切换到流动模式:

     

添加'数据'事件处理程序。

     

调用stream.resume()方法。

     

调用stream.pipe()方法将数据发送到Writable。

顺便说一句,要创建一个可读的,请检查nomsmississippi.from