首页 > 解决方案 > 创建自定义 EventEmitter 时不需要调用 .emit 吗?

问题描述

var myEvent = new EventEmitter(); 
myEvent.on("someEvent", messg => {   console.log(messg); });
myEvent.emit("someEvent", "Hello its my first custom event");

所以我创建了一个 EventEmitter 对象和自定义事件。我将我的自定义事件添加"someEvent"到 myEvent 对象,然后调用.emit函数来查看内部箭头函数的结果。

var fs = require("fs");

var myReadStream = fs.createReadStream(__dirname + "/readme.txt", {
  highWaterMark: 50
});
//data event added
myReadStream.on("data", chunk => {
  console.log("new chunk received:");
  console.log(chunk);
});

但是,在这个流式传输示例中,我没有调用.emit函数,而是调用了这个箭头函数。怎么会这样,我猜那个"data"事件是建在事件里的?

标签: javascriptnode.jsstream

解决方案


确实,它是内置的。

使用fs.createReadStreamAPI 后,将创建一个可读流data,并在侦听器绑定到该事件时调用该事件。

从文档:

每当流将数据块的所有权让给消费者时,就会发出“数据”事件。每当通过调用 readable.pipe()、readable.resume() 或通过将侦听器回调附加到“数据”事件而以流动模式切换流时,都可能发生这种情况。


推荐阅读