【问题标题】:Why don't Node.js ReadableStreams support reading from asynchronous sources?为什么 Node.js ReadableStreams 不支持从异步源读取?
【发布时间】:2014-11-10 16:32:36
【问题描述】:

我正在实现一个可读流。在我的_read() 实现中,流的源是需要异步调用的Web 服务。为什么_read()不提供我的异步调用返回时可以调用的done回调函数?

Transform 流和 Writable 流都支持这一点。为什么不可读?我只是不正确地使用了可读流吗?

MyReadStream.prototype._read = function() {

  doSomethingAsync('foo', function(err, result) {
     if (result) {
       this.push(result);
     } else {
       this.push(null);
     }

     // why no done() available to call like in _write()?
     // done();
  }
}

在我的实际实现中,我不想再次调用doSomethingAsync,直到之前的调用返回。如果没有 done 回调供我使用,我必须实现自己的节流机制。

【问题讨论】:

  • 您不能使用end 事件吗? nodejs.org/api/stream.html#stream_event_end
  • 这表示该流已完全从其源读取。我只想表示一次 _read() 调用已完成从源代码的读取。
  • 你当然是对的,我的错。再次查看文档,是否需要 done() 回调?推入this,假设它继承自stream.Readable,应该触发新的读取以及触发可读事件。我可能大错特错,因为我只使用过而不是实现自己的流阅读器。

标签: node.js


【解决方案1】:

_read() 是通知缓冲数据量低于highWaterMark,因此可以从上游拉取更多数据。

_write() 有一个回调,因为它必须知道您何时完成了对块的处理。如果你长时间不执行回调,可能会到达highWaterMark,数据应该停止流入。当你执行回调时,内部缓冲区可以再次开始耗尽,允许更多的写入继续。

所以_read() 不需要回调,因为它是您可以随意忽略的建议性内容,因为它只是告诉您流能够在内部缓冲更多数据,而 _write() 中的回调至关重要,因为它控制背压和缓冲。如果您需要限制您的 Web API 调用,您可以查看 async 模块必须提供的功能,尤其是 async.memoize 和/或 async.queue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 2023-02-22
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 2012-04-12
    相关资源
    最近更新 更多