writeStream创建好了之后,是如何请求数据的
发布于 8 年前 作者 suntopo 3212 次浏览 来自 问答

疑问来自这里

//可读流在接收者没有读取数据之前,会缓存所有压入的数据
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的概述。

stream3

要是对stream历史感兴趣,算了我不安利自己的博客了。。。

@reverland 不知道楼主从哪里看到的这个 我回答的是这个问题。。。。我百度第一篇就是这个…

@gjc9620 的确是看的这个博客

@reverland 亲感觉这个图老棒了,您博客是好多呢,球学习

@reverland 亲球博客地址****

回到顶部