writeStream创建好了之后,是如何请求数据的
疑问来自这里
//可读流在接收者没有读取数据之前,会缓存所有压入的数据
var Readable = require('stream').Readable;
var rs = new Readable;
rs.push('beep ');
rs.push('boop\n');
rs.push(null);
rs.pipe(process.stdout);
//通过重写_read()方法实现了只有在数据接受者请求数据才向可读流中压入数据
var Readable = require('stream').Readable;
var rs = Readable();
var c = 97;
rs._read = function () {
rs.push(String.fromCharCode(c++));
if (c > 'z'.charCodeAt(0)) rs.push(null);
};
rs.pipe(process.stdout);
通过重写_read()方法实现了只有在数据接受者请求数据才向可读流中压入数据,这段话不是很明白。
原来理解是 read.on 'data’之后主动往writeStream里写数据,那这里说的writeStream请求数据是怎么回事呢?是如何请求的呢?
9 回复
不知道楼主从哪里看到的这个。不知为什么这么写。push应该属于实现stream时才会用的api,
我个人理解,data事件属于stream1的设计,如果涉及流量控制不用考虑data事件。
现在的stream3设计中,push会触发readable事件,让consumer能根据处理数据能力来主动请求read(n)数据,而read会调用_read,_read将调用push,这样就能不断推入新的数据。
data事件是个历史遗留,不用想太多。只是为了兼容以前的设计,在read的时候顺便给consumer emit下data事件
参考这个,node的change log中引用的图对stream3的概述。
要是对stream历史感兴趣,算了我不安利自己的博客了。。。