我创建自定义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吗?的主要内容,如果未能解决你的问题,请参考以下文章