这是一个代码示例,与您从网络或文档中获取的内容没有太大区别:
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
来电来得太晚,是否存在错过某项活动的理论机会?
答案 0 :(得分:3)
答案是否定的,在节点0.10.x及更高版本中不可能。创建流时,它会暂停,因此无法发出data
和end
个事件。当您添加data
侦听器(但不是end
侦听器)时,将自动恢复该流。
另外值得一提的是,在当前“tick”结束之前不会发生IO,所以如果你在同一个tick中附加data
个侦听器总是安全的,即使对于早期的节点版本也是如此。例如:
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 tick之后调用的(一个非常糟糕的命名的情况)。
答案 1 :(得分:2)
最简单的思考方式是,您提供的所有代码都是阻塞的,因此在当前流程结束时,流不会发生任何活动,因为vkurchatkin解释说。只有当前滴答的JavaScript执行完成时才能开始流IO。
var fs = require('fs');
var r = fs.createReadStream(process.argv[2], { encoding: 'utf8' });
// Stream created in paused state, JS code is blocking IO
// We're still in the current tick so no IO could have occured since the above lines
r.on('data', function (chunk) {
console.log("chunk: >>>" + chunk + "<<<");
});
// We're still in the current tick so no IO could have occured since the above lines
r.on('end', function () {
console.log("This is the end");
});
// We've left the current tick so the internal IO code will now execute and call the bound events if necessary