javascript - Node 读流: when does the streaming happen?

标签 javascript node.js events stream fs

这是一个代码示例,与您从网上或文档中获得的代码示例没有太大区别:

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 及更高版本中这是不可能的。创建流时,它会暂停,因此无法发出 dataend 事件。当您添加 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/

相关文章:

mysql - 使用 node.js 进行长轮询以获取数据库更新

javascript - 路由匹配不明确

javascript - 针对字符串测试子字符串数组

javascript - 我们如何在 chrome 扩展中向 gmail 撰写栏添加新按钮?是通过 javascript 还是一些 gmail api?

javascript - 使用 Jquery 获取异步加载的 svg 元素的 id

vba - 微软 Access 2010 : Prevent Save in Main Form On Move to Subform

c# - 如何在 C# 中跟踪事件的订阅者?

javascript - 如何使用 Javascript 从 C# 代码设置的 div 内的 span 元素获取值

node.js - npm -g list 不显示任何内容(但 npm list 会显示)

javascript - 在页面加载时启动 Bootstrap 模式