【发布时间】:2013-12-17 12:56:19
【问题描述】:
我正在尝试使用new Node.js streams API 实现一个流,它将缓冲一定数量的数据。当这个流通过管道传输到另一个流时,或者如果某些东西消耗了readable 事件,这个流应该刷新它的缓冲区,然后简单地成为传递。关键是,该流将通过管道传输到许多其他流,并且当附加每个目标流时,必须刷新缓冲区即使它已经被刷新到另一个流。
例如:
-
BufferStream实现了stream.Transform,并保留了一个 512KB 的内部环形缓冲区 -
ReadableStreamA通过管道传送到BufferStream的实例 -
BufferStream写入其环形缓冲区,并从ReadableStreamA读取数据。(数据是否丢失无关紧要,因为缓冲区会覆盖旧数据。) -
BufferStream通过管道传送到WritableStreamB -
WritableStreamB接收整个 512KB 缓冲区,并继续获取从ReadableStreamA到BufferStream写入的数据。 -
BufferStream通过管道传送到WritableStreamC -
WritableStreamC也接收整个 512KB 缓冲区,但这个缓冲区现在与WritableStreamB接收的不同,因为更多数据已写入BufferStream。
这可以通过流 API 实现吗?我能想到的唯一方法是使用一种方法创建一个对象,该方法为每个目的地启动一个新的 PassThrough 流,这意味着我不能简单地通过管道进出它。
不管怎样,我已经使用旧的“流动”API 完成了这项工作,只需在 data 事件上侦听新的处理程序。当.on('data') 附加一个新函数时,我会直接使用环形缓冲区的副本调用它。
【问题讨论】:
-
一个疑问:数据是否仅在 512KB 突发中移动,还是只有第一个为 512KB?
-
@user568109 当某物开始从缓冲流接收数据时,它应该接收初始的 512KB 缓冲区(仅一次),然后在数据可用时继续通过缓冲流接收数据。只有第一个块是 512KB(或者缓冲区的大小)。
标签: javascript node.js stream