意外的Node.js程序流

意外的Node.js程序流,node.js,Node.js,我是node.js新手,正在使用API。在流模块文档中,我遇到了这个“unpipe事件”示例(实际上是文档中两个示例的融合) 我无法理解以下console.log顺序: "Stop writing to file.txt" "Something has stopped piping into the writer" "Manually close the file stream" 假设setTimeout回调正在运行——据我所知,这是事件循环的第一阶段——那么在setTimeout回调完成之前

我是node.js新手,正在使用API。在流模块文档中,我遇到了这个“unpipe事件”示例(实际上是文档中两个示例的融合)

我无法理解以下console.log顺序:

"Stop writing to file.txt"
"Something has stopped piping into the writer"
"Manually close the file stream"
假设setTimeout回调正在运行——据我所知,这是事件循环的第一阶段——那么在setTimeout回调完成之前,“unpipe”事件的回调究竟是如何开始运行的呢

最初,我在超过零秒的时间后启动setTimeout,但是我发现取消管道回调总是首先调用。我推断我的计算机总是在setTimeout准备就绪之前先读取文件。(虽然我在文档中看不到任何关于完成写入文件引发“unpipe”事件的内容,但我认为这是有意义的)。然而,就我的一生而言,我无法解释上述程序流程是如何发生的。提前感谢您的帮助。

按照以下说明:

EventEmitter
按照注册的顺序同步调用所有侦听器

也就是说,当调用
.emit
时,它会同步运行所发出事件的所有侦听器并调用它们

请注意,如有必要,您可以在
process.nextTick
中包装回调代码,以确保它始终异步运行,但在您的情况下,这可能是不必要的


另外,调用
.emit
(事件的发出)的源通常是异步的。

事件处理程序回调发出synchronouslyAh,谢谢。我刚刚用事件发射器检查了浏览器中的客户端JS,您在该示例中所说的也是正确的。所以“事件处理程序”不是由事件循环来处理的,对吗?非常准确地说,它们是由事件循环来处理的,但是以同步的方式处理,这意味着在事件循环的同一轮中,与代码片段中的
setTimeout
处理程序:)谢谢。下一步我将介绍“事件”模块,我想哈哈。为大家干杯。
"Stop writing to file.txt"
"Something has stopped piping into the writer"
"Manually close the file stream"