一个nodejs stream诡异的行为, 猜测和事件循环有关系, 求解释?

当前目录下准备一个test.txt,写入一些东西,比如
>It'sfortest<
分别执行代码:
注释掉延时为3ms的代码块,输出dest.txt,内容为
>It'sfortest<
注释掉延时为2ms的代码块,输出dest.txt,内容为
>It'sfortest<>It'sfortest<
以下为代码
constfs=require('fs')
constfrom=fs.createReadStream('test.txt')
constto=fs.createWriteStream('dest.txt',{
flags:'a'
})
from.pipe(to,{
end:false
})
from.on('end',()=>{
console.log('end')
})
//setTimeout(()=>{
//from.pipe(to)//thiswon'twork,iftime>=3
//},3)
//setTimeout(()=>{
//from.pipe(to)//thiswillwork,iftime<3
//},2)
只触发end事件一次
不同时间延迟,输出不同,行为十分诡异,求解释?
不负相思意
浏览 387回答 2
2回答

翻阅古今

通过I/O读取字符串到缓冲区timers阶段没有callback执行,写入WriteStream,timers阶段检测到callback,执行callback,然鹅ReadStream没数据,pipe没有效果。timers阶段检测到callback,执行callback,ReadStream数据还在,pipe有效果。用process.stdout测试constfs=require('fs')constfrom=fs.createReadStream('test.txt')from.pipe(process.stdout,{end:false})from.on('end',()=>{console.log('end')})setTimeout(()=>{console.log('timercallback')from.pipe(process.stdout)//thiswon'twork,iftime>=3},3)//setTimeout(()=>{//console.log('timercallback')//from.pipe(process.stdout)//thiswillwork,iftime

智慧大石

默认情况下,在源流发出时stream.end()在目标Writable流上调用,以便目标不再可写。要禁用此默认行为,可以将该选项作为传递,从而使目标流保持打开状态:reader.pipe(writer,{end:false});上面说的很清楚了,设置false是保持打开状态,不是你理解的可以一直编辑,也是有时间限制的由于Js是异步处理,所有程序同步执行,写入和settimeout也一样,所以当你设置延迟时长高的时候,是没办法注入进去的。谢谢
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript