在超时内丢失空文件读取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版本中可能会发生以下情况:

  1. 你开始阅读stream在var stream = fs.createReadStream(fileNameTarget);
  2. 控制立即通过setTimeout产生节点事件循环
  3. 'open''data''end'事件被触发,但是处理程序还没有build立(因为setTimeoutcallback没有轮到他执行)。
  4. 执行setTimeoutcallback,但该文件已被读取。

包含内容的文件读取和打开速度较慢,因此,您将得到与没有setTimeout行为相同的行为 – stream事件都发生在超时事件之后。