【问题标题】:Why can I push into a Readable stream?为什么我可以推入可读流?
【发布时间】:2016-11-13 23:36:35
【问题描述】:

在我发现“setEncoding”方法之前,我一直在使用与此类似的一段代码。在重构代码时,我想到了这个问题。

readable.push(chunk, 'base64')
readable.push(null)
readable.pipe(res)

推送不是一种写数据的形式吗?我不应该无法将任何数据写入可读流吗?我知道每个数据都需要在某些时候被写入(否则它将为空)和读取(或者它变得无用),但我认为 Node 会从我们那里抽象出来。

有人可以帮我解决这个问题吗? 谢谢

【问题讨论】:

  • 我也觉得很乱,所以push就是输出可读的steam是输出数据的数据源

标签: node.js stream


【解决方案1】:

当您从头开始创建新的可读流时,这就会发挥作用。可读流需要从某个地方开始,并且需要有一种方法可以将数据放入新的流中。在您的问题中执行push() 时,您正在缓冲数据,直到它被读取,然后从流中刷新,然后通过管道传输/读取到目的地以供使用。消费者将继续读取数据,直到命中“null”,这表示流已完成输出数据。

var stream = require('stream');
var readable = new stream.Readable(); // new empty stream.Readable
readable.push('some data');
readable.push(null); // Done writing data

要全面了解流如何在底层工作以及各种类型的流,您应该阅读 Substack 的 Stream Handbook。这应该可以回答您可能遇到的任何挥之不去的问题。

【讨论】:

  • 还有一件事:这是异步创建 Readables 的方式吗?
  • Node 的异步方面只有在您执行受 I/O 限制的操作时才真正发挥作用。 Node 是单线程的,一次只能做一件事,异步操作由 libuv 处理,这创造了 node 的多线程感觉。但是,这不是阻塞操作,这意味着在执行此代码时仍然可以处理异步操作。
  • 阅读文档后,一切都变得更有意义了:“end 在阅读器结束时结束编写器。默认为 true。”有一个流的写入者和读取者,当写入者结束时,无法将更多数据写入 Readable。这就是推动 null 的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 2010-10-28
  • 2019-12-07
  • 2020-11-04
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
相关资源
最近更新 更多