我是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”事件的文件写入完成的任何提及,但是我认为这很有意义)。但是,我不能一辈子都知道上面的程序是如何发生的。预先感谢您的帮助。
答案 0 :(得分:1)
EventEmitter
按照注册它们的顺序同步调用所有侦听器。
也就是说,当调用.emit
时,它将在所有侦听器中同步运行所发出的事件并对其进行调用。
请注意,如有必要,您可以将回调代码包装在process.nextTick
中,以确保其始终异步运行,但是在您的情况下,可能没有必要。
另外,.emit
的调用源(事件的发出)通常是异步的。