我经常听说过Streams2和旧流,但什么是Streams3? It get mentioned in this talk by Thorsten Lorenz
我在哪里可以阅读它,Streams2和Streams3之间有什么区别。
在Google上进行搜索,我也在Changelog of Node 0.11.5,
中看到了它stream:简化流动,被动数据监听(streams3)(isaacs)
答案 0 :(得分:44)
我要试一试,但我可能错了。从来没有写过Streams1(old-streams)或Streams2,我可能不是自己回答这个问题的合适人选,但现在就去了。似乎Streams1 API仍然存在一定程度。在Streams2中,有两种模式的流流动(传统)和非流动。简而言之,支持流动模式的垫片正在消失。这是message that lead to the patch now called called 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()以获取数据块。 - Node v0.10.25 Docs
Isaac Z. Schlueter said in November slides I dug up:
streams2
- “suck streams”
- 而不是'数据'事件喷出,调用read()从源
中提取数据- 解决所有问题(我们知道)
因此,似乎在streams1中,您创建了一个对象并向该对象调用.on('data', cb)
。这会将事件设置为触发器,然后您受到流的支配。在Streams2中,内部流有缓冲区,您可以显式地从这些流中请求数据(使用`.read)。 Isaac继续指定如何在Streams2中进行向后兼作以保持Streams1(旧流)模块正常运行
old-mode streams1 shim
- 新流可以切换到旧模式,在那里他们会发出'数据'
- 如果添加'data'事件处理程序,或调用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
做同样的事情。答案 1 :(得分:6)
似乎在io.js中引入了Streams3,然后在Node 0.11 +
中引入Streams 1支持的数据被推送到流中。没有消费者控制,无论消费者是否准备好,都会向消费者投掷数据。
Streams 2允许根据Streams 1将数据推送到流,或者允许消费者根据需要从流中提取数据。消费者可以在拉模式下控制数据流(在通知可用数据时使用stream.read())。流不能同时支持推拉。
Streams 3允许在同一个流上提取和推送数据。
这里有很棒的概述:
https://strongloop.com/strongblog/whats-new-io-js-beta-streams3/
答案 2 :(得分:-4)
我建议你阅读文档,更具体地说是阅读流消费者的#34; API,它实际上是非常容易理解的,除了我认为其他答案是错误的:http://nodejs.org/api/stream.html#stream_readable_read_size < / p>