2016-07-05 61 views
1

我創建了自己的readstream。但是我想知道_read()何時被調用?如果我不添加listerner,_read()將不會被調用。爲什麼?_read()的Node Readable Stream何時調用

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'); 
}); 

回答

2

如果我不加的( '數據')listerner的_read()將不會被調用。爲什麼呢?

流已暫停。假設你正在使用最新版本的節點。

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

所有可讀流處於暫停狀態開始,但可以切換到FL通過以下方式之一的欠款模式:

添加'data'事件處理程序。

調用stream.resume()方法。

調用stream.pipe()方法將數據發送到Writable。

順便說一句,以產生可讀,檢查nomsmississippi.from

+0

添加一個「數據」的事件處理程序將切換到流動模式?源代碼在哪裏?我也發現它與process.nextTick有關? – jason

+0

https://github.com/nodejs/node/blob/be68b68d4863f0d389cc46fdf6f1cbcd1b241d0a/lib/_stream_readable.js#L677 –

相關問題