美文网首页
EventEmitter

EventEmitter

作者: Time_Notes | 来源:发表于2020-05-22 23:23 被阅读0次

EventEmitter本质上是一个观察者模式的实现,所谓观察者模式:

它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生改变时,所有依赖于它的对象都将得到通知。

因此最基本的EventEmitter,包含了一个观察者和一个被监听的对象,对应的实现就是EventEmitter中的on和emit:

var events=require('events');

var eventEmitter=new events.EventEmitter();

eventEmitter.on('say',function(name){

    console.log('Hello',name);

})

eventEmitter.emit('say','Elsa');

eventEmitter是EventEmitter模块的一个实例,eventEmitter的emit方法发出say事件;通过eventEmitter的on方法监听,从而执行相应的函数。


EventEmitter构造函数的实现

function EventEmitter(){

    this._events =Object.create(null);

}


addListener(eventName,listener):为指定事件添加一个监听器,别名为on

removeListener(eventName,listener):移除某个事件的监听器,别名为off

EventEmitter.prototype.on=EventEmitter.prototype.addListener

EventEmitter.prototype.off=EventEmitter.prototype.removeListener


on和once的区别:

on对于某一指定事件添加的监听器可以持续不断的监听相应的事件;once添加的监听器,监听一次后就会被消除。


两个特殊的事件:newListener和removeListener

当实例化EventEmitter模块之后,监听对象是一个对象,包含了所有的监听事件。而这两个特殊的方法就是针对监听事件的添加和移除。

newListener:在添加新事件监听器触发

removeListener:在移除事件监听器时触发

以newListener为例,会在添加新事件监听器的时候触发:

function hello(name){

  console.log("hello",name);

}

var events=require('events');

var emitter=new events.EventEmitter();

emitter.on('newListener',function(eventName,listener){

  console.log(eventName);

  console.log(listener);

});

emitter.addListener('say',hello);

//输出say和[Function: hello]

从上述的例子来看,每当添加新的事件,都会自动的emit一个"newListener"事件,且参数为eventName(新事件的名)和listener(新事件的执行函数)。

同理特殊事件removeListener也是同样的,当事件被移除,会自动emit一个"removeListener"事件。


emit方法是出发事件,并执行相应的方法

emit方法实现的程序流程图

on方法则是对于指定的事件添加监听函数,就是往事件对象中_events添加相应的属性。

on()流程图 off()流程图

相关文章

网友评论

      本文标题:EventEmitter

      本文链接:https://www.haomeiwen.com/subject/lcxfnhtx.html