创建自定义EventEmitter时不需要调用.emit吗?

时间:2018-09-12 19:20:09

标签: javascript node.js stream

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"事件?

2 个答案:

答案 0 :(得分:0)

实际上是内置的。

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

从文档中

  

每当流将大量数据的所有权交给使用者时,都会发出“数据”事件。每当通过调用read.pipe(),read.resume()或将侦听器回调附加到“数据”事件而将流切换为流模式时,都可能发生这种情况。

答案 1 :(得分:0)

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

  

但是,在此流传输示例中,我没有调用.emit函数,而是调用了该箭头函数。我猜这是怎么回事,我猜“数据”事件是事件内置的?

是的,data事件是内置事件,属于流的一部分。一旦为data事件注册了一个侦听器,它将开始流的流动,然后每当有要读取的数据时,它将发出data事件。这是stream.Readable创建的fs.createReadStream()的内置行为。

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

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);
}

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