为什么Node.js ReadableStreams不支持从asynchronous源读取?
我正在实施一个可读stream。 在我的_read()
实现中,stream的源是一个需要asynchronous调用的Web服务。 为什么不_read()
提供一个done
callback函数,可以调用时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
,直到先前的调用已经返回。 没有done
callback,我必须实现我自己的节stream机制。
_read()
是缓冲数据量低于highWaterMark
,因此可以从上游获取更多的数据。
_write()
有一个callback,因为它必须知道你什么时候完成处理块。 如果长时间不执行callback,可能会到达highWaterMark
并且数据应该停止stream入。执行callback时,内部缓冲区可能会再次开始耗尽,从而允许更多的写入操作继续。
所以_read()
不需要callback,因为这是一个可以自由忽略的build议,因为它只是告诉你,stream能够在内部caching更多的数据,而_write()
的callback是关键的,因为它控制背压和缓冲。 如果您需要限制您的Web API调用,则可以查看async
模块必须提供的内容,特别是async.memoize
和/或async.queue
。