Node.js Transform流首次写入后停止?示例仅输出一次"foo"的原因
为什么Node.js中的Transform流在首次写入后停止写入?
你的代码里只输出一次"foo"的核心原因,是**_transform方法没有调用传入的callback函数**,这直接阻塞了Transform流的处理队列,导致后续的写入请求被挂起。
原理拆解
Transform流的工作逻辑是这样的:每当你调用stream.write()时,数据会被送入内部队列,然后触发_transform方法处理。但流需要明确知道当前chunk的处理已经完成,才会继续从队列中取出下一个chunk处理——这个“完成信号”就是通过调用callback来传递的。
如果一直不调用callback,流会认为当前的chunk还在处理中,就会暂停接收新的写入请求,自然就只会输出第一次写入的内容了。
修复后的代码
只需要在_transform方法里添加callback()调用,就能让流正常处理所有10次写入:
const { Transform } = require('stream'); class Stream extends Transform { constructor(){ super({autoDestroy : false, emitClose :false}); } _transform(chunk, encoding, callback){ this.push(chunk); callback(); // 关键:告知流当前chunk处理完成,可继续接收下一个 } } let stream = new Stream(); stream.pipe(process.stdout, {end:false}); for (let i = 0; i < 10; i++) { stream.write('foo'); }
扩展:处理异步场景
如果你的_transform里需要做异步操作(比如数据库查询、HTTP请求),只需要把callback放在异步操作的回调里调用即可,流会自动等待异步处理完成后再处理下一个chunk:
_transform(chunk, encoding, callback){ // 模拟异步处理逻辑 setTimeout(() => { this.push(chunk.toString().toUpperCase()); // 比如把内容转成大写 callback(); }, 100); }
内容的提问来源于stack exchange,提问作者stackhatter
相关产品推荐
相关产品推荐

