考虑一个简单的例子:
stream = require 'stream'
util = require 'util'
class TestTransform extends stream.Transform
_transform: (chunk, encoding, callback) ->
if not @noMore
@noMore = true
@unshift chunk # I will handle you later
else
@push " <#{chunk.toString().toUpperCase()}>"
callback()
mt = new TestTransform()
mt.write 'first'
mt.write 'second'
mt.on 'data', (chunk) -> console.log "data: #{util.inspect chunk.toString()}"
$ coffee test.coffee data: 'first <SECOND>'
这个转换流试图将它的第一个块推回读队列,所以它将在下一个_transform
调用中处理。
但由于某种原因,Transform
中的unshift
会导致数据立即进入输出,而不会再次进入_transform
(因此不是大写)。这是故意的还是我漏掉了什么?
unshift
是Readable
方法。这意味着当你在转换中调用它时,你将东西推回输出端缓冲区,而不是输入端。
不要这样做。由于无法知道输出端缓冲区中有多少数据,因此这实际上是以不确定的顺序推送数据的。