2017-04-04 61 views
0

我想通过扩展stream.Readable来实现可读流。超类流的问题。复杂的

根据文档,我所要做的就是实现_read()。

我不明白的是在_read中如何处理没有数据的数据,或者一旦我再次获取数据时如何触发另一个_read调用。在Readable中我没有看到一个概念来处理缓慢或延迟传递的数据。我可以看到_read()在调用pipe()函数后立即被调用。

如果在_read任何时候,我都没有数据我有不提供返回,似乎_read永远不会再次调用。一旦数据准备就绪,我尝试发出可读的事件,但不会触发对_read的调用。

这个问题并不仅仅发生在启动,但每当我需要源的交付时间可能会发生。 Stream.Readable不支持缓慢的来源吗?

回答

1

_read()仅仅是一个信号,让你知道更多的数据可以/应该从上游源读取。这个问题最重要,当你push()数据流和push()返回false。当发生这种情况时,您应该再次调用_read()之前不要再推送任何数据。

没有什么能阻止你随时推送任何数量的数据,但如果你没有检查push()的返回值并相应地采取行动,那么你最终可能会在内存中缓冲太多的数据。

此外继承/子类Readable的时候,你会想要确保你打电话给你流实例(this)的范围内超类的构造函数(用于ES6类)或Readable构造在自己的构造函数(预ES6类/原型继承)(例如Readable.call(this, { /*Optional Readable settings*/ })

+0

谢谢,这样做的工作。为什么它不在文档中? – Thomas

+0

如果您认为它不够清楚,请考虑在节点repo中提交一个PR,并改变措辞。有时候,对于那些长期在代码库中工作的人来说,第一次来这个项目的用户可能会很困难。 – mscdex