我经常听说过Streams2和老流,但什么是Streams3?Thorsten Lorenz在这次演讲中提到了这一点.
我在哪里可以阅读它,Streams2和Streams3之间有什么区别.
stream:简化流动,被动数据监听(streams3)(isaacs)
Eva*_*oll 45
我要试一试,但我可能错了.从来没有写过Streams1(old-streams)或Streams2,我可能不是自己回答这个问题的合适人选,但现在就去了.似乎Streams1 API仍然存在一定程度.在Streams2,有流的两种模式流动(传统),和非流动.简而言之,支持流动模式的垫片正在消失.这是导致现在称为Streams3的补丁的消息,
与streams2相同的API,但删除了flow/old模式切换的混乱模式.
- 每次
read()调用并返回一些数据时,都会触发数据事件.resume()将使它重复调用read().否则,没有变化.pause()会让它停止read()反复呼叫.pipe(dest)并on('data', fn)会自动拨打电话resume().- 没有切换到旧模式.只有流动,暂停了.Streams开始暂停.
不幸的是,为了理解定义Streams3的任何描述,您需要首先了解Streams1和遗留流
首先,我们来看看Node v0.10.25文档对这两种模式的看法,
可读流有两种"模式":流动模式和非流动模式.在流动模式下,数据从底层系统读取并尽快提供给您的程序.在非流动模式下,您必须显式调用stream.read()以获取数据块.- 节点v0.10.25文档
Isaac Z. Schlueter在11月份说过我挖出的幻灯片:
streams2
- "吸吮溪流"
- 而不是"数据"事件喷出,调用read()从源中提取数据
- 解决所有问题(我们知道)
因此,似乎在streams1中,您将创建一个对象并调用.on('data', cb)该对象.这会将事件设置为触发器,然后您受到流的支配.在Streams2中,内部流有缓冲区,您可以显式地从这些流中请求数据(使用`.read).Isaac继续指定如何在Streams2中使用后向compat来保持Streams1(旧流)模块的运行
旧模式streams1垫片
- 新流可以切换到旧模式,在那里它们会发出"数据"
- 如果添加"数据"事件处理程序,或调用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()
})
})
Run Code Online (Sandbox Code Playgroud)
q启动读取和发射(可能丢失数据),直到调用q.pause建议q停止提取数据但不发出事件以清除它已读取的内容.q开始暂停,直到调用.pause()表示模拟旧模式.q启动时暂停,从未从文件句柄中读取成为q.pause()noop,并且在调用时q.on('data', cb)将调用,q.resume直到缓冲区中没有更多数据.然后,再次打电话q.resume做同样的事情.似乎Streams3在io.js中引入,然后在Node 0.11+中引入
Streams 1支持的数据被推送到流.没有消费者控制,无论消费者是否准备好,都会向消费者投掷数据.
Streams 2允许根据Streams 1将数据推送到流,或者消费者根据需要从流中提取数据.消费者可以在拉模式下控制数据流(在通知可用数据时使用stream.read()).流不能同时支持推拉.
Streams 3允许在同一个流上提取和推送数据.
很棒的概述:
https://strongloop.com/strongblog/whats-new-io-js-beta-streams3/