问题描述
我正在尝试实现一个简单的 node.js 流复用器/解复用器。
目前在实现多路复用机制时,我注意到多路复用器的输出被连接成一个单一的块。
const { Passthrough,Transform } = require("stream");
class Mux extends Passthrough {
constructor(options) {
super(options);
}
input(id,options) {
let encode = new Transform({
transform(chunk,encoding,cb) {
let buf = Buffer.alloc(chunk.length + 1);
buf.writeUInt8(id,0);
chunk.copy(buf,1);
cb(null,buf);
},...options
});
encode.pipe(this);
return encode;
};
};
const mux = new Mux();
mux.on("readable",() => {
console.log("mux >",mux.read())
});
const in1 = mux.input(1);
const in2 = mux.input(2);
in1.write(Buffer.alloc(3).fill(255));
in2.write(Buffer.alloc(3).fill(127));
输出看起来像这样:mux > <Buffer 01 ff ff ff 02 7f 7f 7f>
。
我本以为我会收到两个 console.log
输出。
预期输出:
mux > <Buffer 01 ff ff ff>
mux > <Buffer 02 7f 7f 7f>
有人能解释一下为什么我只能从两个输入中得到一个“可读”事件和一个连接的块吗?
解决方法
使用 data
事件并从回调中读取:
每当流将数据块的所有权放弃给消费者时,就会发出 'data' 事件。
mux.on("data",d => {
console.log("mux >",d)
});
现在产生:
mux > <Buffer 01 ff ff ff>
mux > <Buffer 02 7f 7f 7f>
还解释了为什么 readable
只发出一次 in the docs:
一旦到达流数据的末尾但在发出 'end' 事件之前,也将发出 'readable' 事件。
data
和 readable
的行为不同。在您的情况下, readable
永远不会发出,直到到达流数据的末尾,它会立即返回所有数据。 data
在每个可用块上发出。