【问题标题】:Read exactly n bytes asynchronously异步读取 n 个字节
【发布时间】:2015-02-17 02:00:46
【问题描述】:

我正在开发一个 node.js 项目。是否可以从流中异步准确地读取 n 字节?

通常,如果我想异步读取流,我会使用事件。问题是我也需要异步处理流的其余部分。

如果我监听data 事件,我可以稍后使用流的其余部分,但我无法控制一次要读取多少字节。我尝试使用unshift 将未使用的字节放回缓冲区,但这似乎不会在稍后添加另一个侦听器时触发data 事件。

This question 类似,但唯一的答案是同步解决方案。

是否有限制传递给data 事件侦听器的字节数的选项?是否有可能以某种方式将字节推回流中,并且仍然可以通过事件访问它们?

【问题讨论】:

    标签: javascript node.js asynchronous stream


    【解决方案1】:

    只要您正在收听readable 事件并且没有进行调用stream.read(n); 的阻塞查看,那么该解决方案就是异步的。像下面这样的东西(未经测试!)应该可以得到你想要的。

    function streamChunk(stream, size, dataCallback, doneCallback) {
      function getChunk() {
        var data = stream.read(size);
        if(data != null) {
          dataCallback(data);
          setImmediate(getChunk);
        }
      }
    
      stream.on('readable', getChunk);
      stream.on('end', doneCallback);  
    }
    

    【讨论】:

    • 谢谢,我在几分钟前再次阅读节点文档时发现了这一点。我的实现有点不同,我认为你应该在获取数据后添加removeListener
    • 你为什么要这样做?根据文档:一旦内部缓冲区耗尽,当有更多数据可用时,可读事件将再次触发。因此,在您 stream.read 所有缓冲后,它不应该触发另一个可读事件数据。 nodejs.org/api/stream.html#stream_event_readable
    • @timotysrimple 这种情况是可能的,不是吗?想象一下另一段代码稍后会耗尽缓冲区,并发出另一个readable 事件,因此您的侦听器将再次读取数据。我错了吗?
    • 您是指不同的流,还是单个流上的多个readable 事件?如果是后者,那是设计使然。 readable 事件不一定会在 all 数据准备好读取时调用,而是在 some 数据准备好时调用。您应该在每个流中获得多个 readable 事件调用,并且您依靠 end 事件知道您已经完成了。
    • 啊,好吧,我认为你的函数应该实现我的要求。事实上,这很好。谢谢! (实际上我只需要在切换到流模式之前读取前 128 位)
    猜你喜欢
    • 2020-06-12
    • 2016-07-05
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    相关资源
    最近更新 更多