什么是Node.js中的Streams3,它与Streams2有什么不同?
我经常听说Streams2和旧stream,但什么是Streams3? 它在Thorsten Lorenz的演讲中被提及 。
我在哪里可以读到,Streams2和Streams3有什么区别。
在Google上进行search时,我也看到它在节点0.11.5的更新日志中提到 ,
stream:简化stream动,被动数据监听(streams3)(isaacs)
我要给这个镜头,但是我可能弄错了。 从来没有写过Streams1(旧stream)或Streams2,我可能不是自己回答这个问题的正确人选,但是在这里。 似乎有Streams1 API仍然存在一定程度。 在Streams2中,有两种stream式(传统)和非stream式 。 总之,支持stream动模式的垫片正在消失。 这是导致现在称为Streams3的补丁的消息 ,
与streams2相同的API,但删除stream动/旧模式切换的混淆模式。
- 每次
read()
被调用,并返回一些数据,一个数据事件触发。resume()
将使其重复调用read()。 否则,没有改变。pause()
将使其停止重复调用read()
。pipe(dest)
和on('data', fn)
会自动调用resume()
。- 没有切换到旧模式。 只有stream动,暂停。 stream开始暂停。
不幸的是,为了理解定义Streams3的任何描述,需要首先理解Streams1和传统stream
背景故事
首先,我们来看看Node v0.10.25文档中关于这两种模式的说法,
可读stream有两种“模式”:stream动模式和非stream动模式。 处于stream动模式时,将从底层系统读取数据并尽快提供给您的程序。 在非stream动模式下,您必须显式调用stream.read()以获取数据块。 – 节点v0.10.25文档
Isaac Z.Schlueter在11月份的时候说 :
streams2
- “吸吮stream”
- 调用read()从源数据中提取数据,而不是“数据”事件
- 解决所有问题(我们知道的)
所以好像在streams1中,你会创build一个对象,并调用.on('data', cb)
到该对象。 这会将事件设置为触发器,然后你就受到stream的控制。 在Streams2内部stream有缓冲区,你可以显式地从这些stream请求数据(使用`.read)。 Isaac继续指定向后compat如何在Streams2中工作以保持Streams1(旧stream)模块正常运行
旧模式streams1垫片
- 新的stream可以切换到旧模式,在那里他们将“数据”
- 如果添加“数据”事件处理程序,或者调用pause()或resume(),则切换
- 对现有的testing做最小的改动,以保持诚实
所以在Streams2中,调用.pause()
或.resume()
会触发垫片。 而且,它应该,对吧? 在Streams2中,你可以控制什么时候.read()
,而且你不会捕捉你正在抛出的东西。 这触发了独立于Streams2的传统模式。
我们以艾萨克的幻灯片为例,
createServer(function(q,s) { // ADVISORY only! q.pause() session(q, function(ses) { q.on('data', handler) q.resume() }) })
- 在Streams1中,
q
开始读取和发送(可能丢失数据),直到q.pause
的调用build议q
停止提取数据,而不是通过发送事件来清除已读取的内容。 - 在Streams2中,
q
开始暂停,直到对.pause()
的调用表明模拟旧模式。 - 在Streams3中,
q
从暂停状态开始,从未从文件句柄中读取,使得q.pause()
成为noop,并且在调用q.on('data', cb)
将调用q.resume
直到没有更多数据在缓冲区中。 然后,再次调用q.resume
做同样的事情。
似乎Streams3是在io.js中引入的,然后在Node 0.11+中引入
stream1支持的数据被推送到一个stream。 没有消费者控制,消费者是否准备好了数据。
数据stream2允许将数据按照数据stream1推送到数据stream中,或者使消费者根据需要从数据stream中提取数据。 用户可以在拉模式下控制数据stream(当通知可用数据时使用stream.read())。 该stream不能同时支持推和拉。
stream3允许在同一个stream上拖拉数据。
这里很好的概述:
https://strongloop.com/strongblog/whats-new-io-js-beta-streams3/
我build议你阅读文档,更具体的“stream消费者的API”一节,它实际上是非常容易理解的,除了我认为其他答案是错误的: http : //nodejs.org/api/stream.html#stream_readable_read_size