Node.js中csv读取流的event emitter何时开始触发事件?
Node.js流事件触发机制答疑
核心原因是Node.js的事件循环执行顺序 + 流的异步初始化逻辑,两点共同保证不会遗漏事件:
- 首先,
fs.createReadStream()仅同步初始化流实例,不会立刻触发底层文件IO操作:文件打开、磁盘读取都是异步任务,会被投递到事件循环的IO事件队列,必须等当前同步执行栈全部清空后才会被调度执行。 - 其次,
file.pipe(csv())操作是同步完成的流绑定,此时虽然流会被切换到流动模式,但底层IO任务还没开始执行,你后续通过reader.on()绑定data、end回调的操作都是同步执行栈内的代码,会全部执行完成后,事件循环才会处理已经就绪的流IO事件。
也就是说,当第一个data事件被触发的时候,你所有的回调函数都已经绑定完成了,自然不会出现漏掉开头数据的问题。
补充说明
如果你想要更稳妥的写法,也可以显式控制流的启动时机,效果和你原有的写法完全一致:
const rows = await new Promise(resolve => { const result = []; const file = fs.createReadStream('src/tests/readability/input.csv'); // 先暂停流,避免自动进入流动模式 file.pause(); const reader = file.pipe(csv()); reader.on('data', row => { result.push(row); }); reader.on('end', () => { resolve(result); }); // 绑定完所有回调后再恢复流的读取 file.resume(); });
内容的提问来源于stack exchange,提问作者mevers303
相关产品推荐
相关产品推荐

