我正在编写一个模块,它是一个可写流。我想为我的用户实现管道接口。
如果发生一些错误,我需要暂停可读流并发出错误事件。然后,用户将决定 - 如果他可以接受错误,他应该能够恢复数据处理。
var writeable = new BackPressureStream();
writeable.on('error', function(error){
console.log(error);
writeable.resume();
});
var readable = require('fs').createReadStream('somefile.txt');
readable.pipe.(writeable);
我看到节点为我们提供了readable.pause()
方法,可以用来暂停可读流。但我无法从可写流模块中调用它:
var Writable = require('stream').Writable;
function BackPressureStream(options) {
Writable.call(this, options);
}
require('util').inherits(BackPressureStream, Writable);
BackPressureStream.prototype._write = function(chunk, encoding, done) {
done();
};
BackPressureStream.prototype.resume = function() {
this.emit('drain');
}
如何在可写流中实现背压?
PS 可以使用pipe/unpipe
提供可读流作为参数的事件。但也有人说,对于管道流,暂停的唯一机会是将可读流从可写流中分离出来。
我做对了吗?在用户调用恢复之前,我必须解除可写流的管道?在用户调用恢复之后,我应该将可读流返回吗?