TL; DR 如何从流中读取某些数据,然后将其放回,以便其他消费者获得相同的data
事件?
这是一个可读的流,流1 ... Infinity:
var Readable = require('stream').Readable;
var readable = new Readable();
var c = 0;
readable._read = function () {
var self = this;
setTimeout(function () {
self.push((++c).toString());
}, 500);
};
我想阅读第一个data
事件,查看数据然后将流“重置”到其原始状态,并允许其他另一个data
侦听器使用第一个事件,就好像它从不发生了。我认为unshift()
将是正确的方法,如文档中所述:
readable.unshift(块)#
块缓冲区| String要转移到读取队列的数据块 这在某些流被a消耗的情况下很有用 解析器,需要“取消”它拥有的一些数据 乐观地拉出源,这样流就可以了 传递给其他一方。
这对我的需求来说听起来很完美,但它并不符合我的预期:
...
readable.once('data', function (d) {
console.log(d.toString()); // Outputs 1
readable.unshift(d); // Put the 1 back on the stream
readable.on('data', function (d) {
console.log(d.toString()); // Heh?! Outputs 2, how about 1?
});
});
答案 0 :(得分:8)
所以我想出了答案:
当您呼叫stream.unshift()
时,如果流处于流动模式,将立即发出数据事件。所以当我在我的例子中添加监听器时,船已经航行了。
readable.unshift(d); // emits 'data' event
readable.on('data', function (d) { // missed `data` event
console.log(d.toString());
});
有几种方法可以让它按照我的预期运作:
1)在取消取消之前添加新的监听器:
readable.once('data', function (d) {
console.log(d.toString()); // Outputs 1
readable.on('data', function (d) {
console.log(d.toString()); // Outputs 1,1,2,3...
});
readable.unshift(d); // Put the 1 back on the stream
});
2)暂停并恢复流:
readable.once('data', function (d) {
console.log(d.toString()); // Outputs 1
readable.pause(); // Stops the stream from flowing
readable.unshift(d); // Put the 1 back on the stream
readable.on('data', function (d) {
console.log(d.toString()); // Outputs 1,1,2,3...
});
readable.resume(); // Start the stream flowing again
});