什么是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动/旧模式切换的混淆模式。

  1. 每次read()被调用,并返回一些数据,一个数据事件触发。
  2. resume()将使其重复调用read()。 否则,没有改变。
  3. pause()将使其停止重复调用read()
  4. pipe(dest)on('data', fn)会自动调用resume()
  5. 没有切换到旧模式。 只有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