Node.js的Readable流调用pause方法无法正常暂停,遗漏了什么配置?
问题根因
- 核心原因是你使用了
pipe()方法对接读写流,pipe()内置了背压自动管理逻辑:只要可写流的缓存未达到高水位线,它会自动调用可读流的resume()方法恢复生产,你手动调用的pause()会被这个逻辑直接覆盖,无法生效。 - 你自定义的
Readable没有终止逻辑,read钩子会无限调用push()生成数据,只要流处于流动状态就会持续生产内容。
修复方案
如果要实现手动控制可读流的暂停/恢复,不要使用 pipe() 自动对接,改为手动监听 data 事件处理数据即可,修改后的代码如下:
const { Readable, Writable } = require('stream'); const r = new Readable({ read() { this.push(Math.random().toString()); } }); const w = new Writable({ write(data, enc, next) { console.log(data.toString()); setTimeout(next, 10) } }); // 替换r.pipe(w) 改为手动监听data事件写数据 r.on('data', chunk => { w.write(chunk); }) setInterval(() => { if(r.isPaused()) { console.log('>>>>>>>>>>>>>>>>>>> RESUMING') r.resume(); } else { console.log('>>>>>>>>>>>>>>>>>>> PAUSING') r.pause(); } }, 1000);
修改后运行即可看到每秒切换暂停/恢复状态,输出也会对应停止/继续的效果。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

