意外的Node.js程序流程

时间:2018-09-18 18:13:42

标签: node.js

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

const fs = require("fs);

const writable = fs.createWriteStream("write.txt");
const readable = fs.createReadStream("read.txt");

readable.pipe(writable);

setTimeout(function(){
    console.log("Stop writing to file.txt");
    readable.unpipe(writable);
    console.log("Manually close the file stream");
    writable.end();    
}, 0);

writable.on("unpipe", function(src){
    console.log("Something has stopped piping into the writer");
});

我无法理解以下console.log命令:

"Stop writing to file.txt"
"Something has stopped piping into the writer"
"Manually close the file stream"

鉴于setTimeout回调正在运行-据我所知,这是事件循环的第一阶段-在setTimeout回调完成之前,“ unpipe”事件的回调实际上是如何开始运行的。

最初,我在零秒以上的时间后触发了setTimeout,但是我发现总是先调用unpipe回调。我以为我的计算机总是在setTimeout准备好之前首先读取文件。 (尽管我在文档中看不到有关引发“ unpipe”事件的文件写入完成的任何提及,但是我认为这很有意义)。但是,我不能一辈子都知道上面的程序是如何发生的。预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

node.js documentation指定:

  

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

也就是说,当调用.emit时,它将在所有侦听器中同步运行所发出的事件并对其进行调用。

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

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