这是一个代码示例,与您从网上或文档中获得的代码示例没有太大区别:
var fs = require('fs');
var r = fs.createReadStream(process.argv[2], { encoding: 'utf8' });
r.on('data', function (chunk) {
console.log("chunk: >>>" + chunk + "<<<");
});
r.on('end', function () {
console.log("This is the end");
});
令我困惑的是:触发事件的流何时发生?显然不是直接构建读取流,因为那样它会在我们到达 on
之前完成,并且事件监听代码永远不会被执行(事实上,这工作得很好) .
让我担心的是:如果 on
调用来得太晚,理论上是否有可能错过某个事件?
最佳答案
答案是否定的,在 Node 0.10.x 及更高版本中这是不可能的。创建流时,它会暂停,因此无法发出 data
和 end
事件。当您添加 data
监听器(但不是 end
监听器)时,流会自动恢复。
还值得一提的是,在当前“tick”结束之前不会发生任何 IO,因此如果您在同一tick 中附加data
监听器始终是安全的,即使对于早期的 Node 版本也是如此。例如:
stream.resume();
stream.on('data', ...); // <- same tick, same javascript invocation = safe
stream.resume();
setImmediate(function () {
stream.on('data', ...); // <- different tick, different javascript invocation = unsafe
});
这可能听起来令人困惑,但在 process.nextTick
回调中添加监听器也是安全的,因为它实际上是在任何 IO 回调之前的 CURRENT 标记之后调用的(这是一种非常糟糕的命名情况)。
关于javascript - Node 读流: when does the streaming happen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26526515/