関数があるとしますBlackBox
。APIは次のようなものです(|
実際、パイプはどこにありますか):
inputStream | BlackBox | outputStream
ただし、BlackBox
実際には a のラッパーrequire('child_process').spawn
なので、実際には次のようになります。
inputStream | BlackBox.Writable -> proc.stdin -> proc.stdout -> BlackBox.Readable | outputStream
でこれを簡単に実行できますがstreams1
、それがどのように優れているかを理解したいですstreams2
。したがって、これまでのところ次のコードがあります。
var Duplex = require('stream').Duplex
var spawn = require('child_process').spawn
var util = require('util')
util.inherits(BlackBox, Duplex)
function BlackBox () {
Duplex.call(this)
// Example process
this.proc = spawn('convert', ['-', ':-'])
var that = this
this.proc.stdout.on('end', function () {
that.push(null)
})
}
BlackBox.prototype._write = function (chunk, encoding, callback) {
return this.proc.stdin.write(chunk, encoding, callback)
}
BlackBox.prototype.end = function (chunk, encoding, callback) {
return this.proc.stdin.end(chunk, encoding, callback)
}
BlackBox.prototype._read = function (size) {
var that = this
this.proc.stdout.on('readable', function () {
var chunk = this.read(size)
if (chunk === null)
that.push('')
else
that.push(chunk)
})
}
私はここで何か悪いことをしていますか?
私の主な関心事は、のドキュメントからの次の抜粋readable._read(size)
です。
データが利用可能になったら、readable.push(chunk) を呼び出して読み取りキューに入れます。push が false を返す場合は、読むのをやめるべきです。_read が再度呼び出されたら、さらにデータのプッシュを開始する必要があります。
どうすれば「読むのをやめる」ことができますか?
明確にするために、背圧とスロットリングを処理する必要があります。