我正在实施一个可读流。在我的_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
回调供我使用,我必须实现自己的节流机制。
答案 0 :(得分:2)
_read()
通知缓冲数据量低于highWaterMark
,因此可以从上游提取更多数据。
_write()
有一个回调,因为它必须知道你何时完成了对块的处理。如果你不长时间执行回调,可能会到达highWaterMark
并且数据应该停止流入。执行回调时,内部缓冲区可能会再次开始耗尽,允许更多写入继续。
所以_read()
不需要回电,因为它是一个你可以自由忽略的忠告,因为它只是告诉你流能够缓冲内部有更多数据,而_write()
中的回调非常重要,因为它控制背压和缓冲。如果您需要限制网络API调用,可以查看async
模块提供的内容,尤其是async.memoize
和/或async.queue
。