我经常听说Streams2和古老的streams,但是Streams3是什么呢?It get mentioned in this talk by Thorsten Lorenz
我在哪里可以读到它,Streams2和Streams3的区别是什么.
在谷歌上搜索的时候,我也看到了Changelog of Node 0.11.5条,
流:简化流动、被动数据监听(streams3)(isaacs)
我经常听说Streams2和古老的streams,但是Streams3是什么呢?It get mentioned in this talk by Thorsten Lorenz
我在哪里可以读到它,Streams2和Streams3的区别是什么.
在谷歌上搜索的时候,我也看到了Changelog of Node 0.11.5条,
流:简化流动、被动数据监听(streams3)(isaacs)
我要试一试,但我可能弄错了.我从未写过Streams1(旧流)或Streams2,我可能不是回答这个问题的合适人选,但现在我来回答.似乎有一个Streams1 API在某种程度上仍然存在.在Streams2中,有两种流模式flowing(传统)和non-flowing.简而言之,支撑流动模式的垫片正在消失.这是message that lead to the patch now called called Streams3,
与流程2相同的API,但删除了Flow/old这一令人困惑的模式
- 每次调用
read()
并返回一些数据时,就会触发一个数据事件.resume()
将使其反复调用read().否则,就没有变化.pause()
会让它停止反复拨打read()
.pipe(dest)
和on('data', fn)
会自动呼叫resume()
.- 没有切换到旧模式.只有流淌,停顿了一下.溪流开始暂停.
不幸的是,要很好地理解任何定义Streams3的描述,首先需要理解Streams1和遗留流
首先,让我们看看 node V0是什么.10.25关于这两种模式,
Readable streams have two "modes": a flowing mode and a non-flowing mode. When in flowing mode, data is read from the underlying system and provided to your program as fast as possible. In non-flowing mode, you must explicitly call stream.read() to get chunks of data out. — Node v0.10.25 Docs
Isaac Z. Schlueter said in November slides I dug up:
流程2
- "吮吸溪流"
- 调用read()从源中提取数据,而不是"数据"事件
- 解决(我们知道的)所有问题
因此,似乎在streams1中,您将创建一个对象并调用.on('data', cb)
来调用该对象.这会将事件设置为触发器,然后你就任由流的摆布了.在Streams2中,流内部有缓冲区,您可以显式地(使用`.read)从这些流请求数据.Isaac接着说明了向后兼容如何在Streams2中工作,以保持Streams1(旧流)模块正常工作
旧模式流1垫片
- 新的流可以切换到旧的模式,在那里它们会喷出"数据"
- 如果添加"数据"事件处理程序,或调用pause()或resume(),则切换
- 对现有测试进行最小的更改以保持我们的诚实
因此,在Streams2中,调用.pause()
或.resume()
会触发垫片.而且,它应该,对吗?在Streams2中,你可以控制何时返回.read()
,并且你不会捕捉到被扔到你身上的东西.这触发了一个独立于Streams2的遗留模式.
让我们以艾萨克的幻灯片为例,
createServer(function(q,s) {
// ADVISORY only!
q.pause()
session(q, function(ses) {
q.on('data', handler)
q.resume()
})
})
q
会立即开始读取和发送数据(可能会丢失数据),直到对q.pause
的调用建议q
停止拉入数据,但不要发送事件以清除它已经读取的内容.q
开始暂停,直到调用.pause()
,这意味着模拟旧模式.q
从暂停开始,从未从文件句柄读取q.pause()
,使其成为noop,在调用q.on('data', cb)
时将调用q.resume
,直到缓冲区中没有更多数据.然后再打q.resume
做同样的事情.