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

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

Transformstream和Writablestream都支持这一点。 为什么不可读? 我只是使用可读的stream不正确?

 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 ,直到先前的调用已经返回。 没有donecallback,我必须实现我自己的节stream机制。

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

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

所以_read()不需要callback,因为这是一个可以自由忽略的build议,因为它只是告诉你,stream能够在内部caching更多的数据,而_write()的callback是关键的,因为它控制背压和缓冲。 如果您需要限制您的Web API调用,则可以查看async模块必须提供的内容,特别是async.memoize和/或async.queue