为什么Node.js ReadableStreams不支持从异步源读取?

时间:2014-11-10 16:32:37

标签: node.js

我正在实施一个可读流。在我的_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回调供我使用,我必须实现自己的节流机制。

1 个答案:

答案 0 :(得分:2)

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

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

所以_read()不需要回电,因为它是一个你可以自由忽略的忠告,因为它只是告诉你流能够缓冲内部有更多数据,而_write()中的回调非常重要,因为它控制背压和缓冲。如果您需要限制网络API调用,可以查看async模块提供的内容,尤其是async.memoize和/或async.queue