在超时内丢失空文件读取stream事件
我正在从一个文件读取代码,并包括超时代码。 我有空文件的问题。
如果没有超时,下面将打印“可读:真,开放,数据(0+次),结束”。 这与空文件或包含内容的文件的作用相同。 随着超时(即使是0),行为也会有很大的变化,这取决于文件是否为空。 对于一个带有内容的文件,我得到了像没有超时一样的东西,但是一个空文件我得到的是“可读:假”。
为什么当我有一个超时(甚至0),这与空文件工作如此不同? 这个问题有一个简单的解决方法吗?
var stream = fs.createReadStream(fileNameTarget); stream.pause(); setTimeout(function() { stream.resume() console.log('readable: ' + stream.readable); stream.on('open', function() { console.log('open'); }); stream.on('data', function() { console.log('data'); }); stream.on('end', function() { console.log('end'); }); }, 0);
不同之处在于setTimeout
产生对节点事件循环的控制。
这意味着,虽然没有setTimeout
控件,但直到stream事件处理程序都设置setTimeout
,才会离开您的代码,在setTimeout
版本中可能会发生以下情况:
- 你开始阅读stream在
var stream = fs.createReadStream(fileNameTarget);
- 控制立即通过
setTimeout
产生节点事件循环 -
'open'
,'data'
和'end'
事件被触发,但是处理程序还没有build立(因为setTimeout
callback没有轮到他执行)。 - 执行
setTimeout
callback,但该文件已被读取。
包含内容的文件读取和打开速度较慢,因此,您将得到与没有setTimeout
行为相同的行为 – stream事件都发生在超时事件之后。