如何正确地取消管道nodejs流

时间:2015-01-14 14:32:58

标签: node.js stream pipe duplex

如果在.unpipe之后传输了流,我会尝试找出.pause调用为无操作的原因:

b.on('data', console.log.bind(console, "on b -> "));
c.on('data', console.log.bind(console, "on c -> "));

a.pause();

a.pipe(b);
a.pipe(c);

a.resume();

a.unpipe(b);
a.unpipe(c);
a.write("foo");

打印:

//on b ->  foo
//on c ->  foo

似乎是因为.pause()电话。但重要的是要保持流暂停,直到所有流都用管道输送。 如何以优雅的方式解决此问题?

机会在源流上附加'data'事件监听器作为目标流的写入功能。

b.on('data', console.log.bind(console, "on b -> "));
c.on('data', console.log.bind(console, "on c -> "));

writeToB = b.write.bind(b);
writeToC = c.write.bind(c);


a.pause();

a.on('data', writeToB);
a.on('data', writeToC);

a.resume();

a.removeListener('data',writeToB);
a.removeListener('data',writeToC);

a.write("foo");

但这种方法感觉不错。

1 个答案:

答案 0 :(得分:0)

管道后尝试连接数据事件。

挂钩数据事件会导致管道开始流动。

a.pipe(b);
a.pipe(c);

b.on('data', console.log.bind(console, "on b -> "));
c.on('data', console.log.bind(console, "on c -> "));

a.unpipe(b);
a.unpipe(c);
a.write("foo");