【问题标题】:how correctly unpipe nodejs stream如何正确地解除 nodejs 流
【发布时间】:2025-12-22 03:10:11
【问题描述】:

如果流在.pause 之后通过管道传输,我试图弄清楚为什么.unpipe 调用是无操作的:

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() 来电。但重要的是保持流暂停,直到所有流都通过管道传输。 如何以优雅的方式解决此问题?

有机会在源流上附加“数据”事件侦听器作为目标流的写入函数。

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");

但这种方法感觉不太好。

【问题讨论】:

    标签: node.js stream pipe duplex


    【解决方案1】:

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

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

    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");
    

    【讨论】: