当前目录下准备一个test.txt, 写入一些东西, 比如>It's for test<分别执行代码:注释掉延时为 3 ms的代码块, 输出dest.txt, 内容为>It's for test<注释掉延时为 2 ms的代码块, 输出dest.txt, 内容为>It's for test<>It's for test<以下为代码const fs = require('fs')const from = fs.createReadStream('test.txt')const to = fs.createWriteStream('dest.txt', {
flags: 'a'})from.pipe(to, {
end: false})from.on('end', () => { console.log('end')
})// setTimeout(() => {// from.pipe(to)//this won't work, if time >= 3// }, 3)// setTimeout(() => {// from.pipe(to)//this will work, if time < 3// }, 2)只触发end事件一次不同时间延迟, 输出不同, 行为十分诡异, 求解释?
2 回答
斯蒂芬大帝
TA贡献1827条经验 获得超8个赞
通过I/O
读取字符串到缓冲区
timers
阶段没有callback
执行,写入WriteStream
,timers
阶段检测到callback
,执行callback
,然鹅ReadStream
没数据,pipe
没有效果。timers
阶段检测到callback
,执行callback
,ReadStream
数据还在,pipe
有效果。
用process.stdout
测试
const fs = require('fs')const from = fs.createReadStream('test.txt')from.pipe(process.stdout, { end: false})from.on('end', () => { console.log('end') }) setTimeout(() => { console.log('timer callback') from.pipe(process.stdout) //this won't work, if time >= 3}, 3)// setTimeout(() => {// console.log('timer callback')// from.pipe(process.stdout) //this will work, if time < 3// }, 2)
红糖糍粑
TA贡献1815条经验 获得超6个赞
默认情况下, 在源流发出时stream.end()在目标Writable流上调用,以便目标不再可写。要禁用此默认行为, 可以将该选项作为传递,从而使目标流保持打开状态:
reader.pipe(writer, { end: false });
上面说的很清楚了,设置false是保持打开状态,不是你理解的可以一直编辑,也是有时间限制的
由于Js是异步处理,所有程序同步执行,写入和settimeout也一样,所以当你设置延迟时长高的时候,是没办法注入进去的。
谢谢
添加回答
举报
0/150
提交
取消