我创建自定义EventEmitter时不应该调用.emit吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我创建自定义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"事件是在事件中建立的?

答案

在node.js中,流是EventEmitter的子类,它发出自己的事件。因此,流本身就是一个调用.emit()。您只需听取您感兴趣的事件,然后流将在适当时发出它们。

但是在这个流式传输示例中,我没有调用.emit函数,但调用了此箭头函数。怎么会发生这种情况,我猜“数据”事件是在事件中构建的?

是的,data事件是一个内置事件,它是流的一部分。一旦你为data事件注册了一个监听器,它就会启动流的流动,然后只要有数据要读,它就会发出data事件。这是stream.Readable创造的fs.createReadStream()的内置行为。

您可以在可读源data中看到code here事件发出的其中一个位置。

function addChunk(stream, state, chunk, addToFront) {
  if (state.flowing && state.length === 0 && !state.sync) {
    state.awaitDrain = 0;
    stream.emit('data', chunk);
  } else {
    // update the buffer info.
    state.length += state.objectMode ? 1 : chunk.length;
    if (addToFront)
      state.buffer.unshift(chunk);
    else
      state.buffer.push(chunk);

    if (state.needReadable)
      emitReadable(stream);
  }
  maybeReadMore(stream, state);
}

您可以在stream.Readable中查看doc here对象发出的所有事件。

另一答案

确实,它是内置的。

一旦你使用fs.createReadStream API,就会创建一个Readable Stream,并在监听器绑定它时调用data事件。

来自文档:

只要流将一大块数据的所有权放弃给消费者,就会发出'data'事件。每当通过调用readable.pipe(),readable.resume()或将侦听器回调附加到'data'事件来以流动模式切换流时,可能会发生这种情况。

以上是关于我创建自定义EventEmitter时不应该调用.emit吗?的主要内容,如果未能解决你的问题,请参考以下文章

用玩笑模拟自定义事件发射器

如何在现有对象上调用EventEmitter

sql server 中的自定义函数应该如何调用?

从 NIB 与从代码加载自定义滑块:从代码加载时不存在子视图

如何使用自动建议创建自定义文本区域?

-performDragOperation:从停靠堆栈拖动时不调用