节点事件事件模块的详细解释
大部分的核心API NodeJS是基于异步事件驱动的设计,以及所有可以分发事件的EventEmitter类的实例对象。我们都知道,因为是单线程运行的NodeJS,Nodejs需要通过事件轮询查询事件队列,然后执行回调函数对应的事件,这是一个有点像Windows的消息映射机制,为更好的实施,信息可以找到另外。
以下是EventEmitter的使用。
1。监控和分发事件
的EventEmitter实例可以使用或听听听事件,并发出()方法将事件,如下图所示:
const事件=需要('events),
events.eventemitter EventEmitter =,
利用=需要('util);
功能myemiter(){
eventemitter.call(本);
};
util.inherits(myemiter、EventEmitter); / / EventEmitter类继承
const myemitterins =新myemiter();
MyEmitterIns.on(数据(O)= > {
console.log('receive数据:+ o.a);
});
或者使用类
类myemiter延伸EventEmitter {} / /继承EventEmitter类
const myemitterins =新myemiter();
MyEmitterIns.on(数据(O)= > {
console.log('receive数据:+ o.a);
});
MyEmitterIns.emit(数据,{ 1 }:);
执行的结果如下:
E: developmentdocument odejsdemo >节点event-example.js
接收数据:1
2。将参数传递到事件监视器的回调函数
从上面的例子可以看出,(发出)参数的方法可以将任意设置回调函数,需要注意的一点是这个关键词是调用发射方法的eventemiter实例,但是箭的功能异常,这指的是全球性的,因为这是必然的箭头功能定义,如下所示:
类myemiter延伸EventEmitter { }
const myemitterins =新myemiter();
MyEmitterIns.on(数据功能(数据){
console.log(:在普遍回调函数);
console.log(本);
});
MyEmitterIns.on('data1(1)= > {
console.log(:在箭头回调函数);
console.log(本);
});
MyEmitterIns.emit(数据,{ 1 }:);
MyEmitterIns.emit('data1,{ 1 }:);
执行的结果如下:
E: developmentdocument odejsdemo >节点event-example.js
公用回调函数:
MyEmiter {
域:null,
_events:{数据:{功能},{ } }功能数据,
_eventscount:2,
_maxlisteners:定义}
箭头回调函数:
{ }
这里的箭头关于这个函数,在路上,为什么可以实现箭头函数的定义来绑定这个,因为没有箭头函数绑定的内部机制,这是在这个范围内使用的,所以不能用作构造函数。
三.事件监视器的执行顺序
eventemiter实例可以绑定多个事件。当我们触发这些事件的顺序,eventemiter将在同步模式下执行。当第一个事件处理函数没有完成时,它不会触发下一个事件。
类myemiter延伸EventEmitter { }
const myemitterins =新myemiter();
MyEmitterIns.on(数据功能(数据){
console.time(数据事件被处决);
对于(var i = 0;i < 100000;i + +)
对于(var j=0;j<100000;j + +)
;
Console.timeEnd(数据事件被处决);
});
MyEmitterIns.on('data1(1)= > {
console.log(的数据事件开始执行…);
});
MyEmitterIns.emit(数据,{ 1 }:);
MyEmitterIns.emit('data1,{ 1 }:);
执行的结果如下:
E: developmentdocument odejsdemo >节点event-example.js
数据事件被执行:4721.401ms
DATA1事件开始执行…
当然,我们可以在回调函数中使用异步操作,如setTimeout,setimmediate或process.nexttick()等,从而实现异步效应。
MyEmitterIns.on(数据功能(数据){
((setimmediate)= > {
console.log(数据执行事件…;
});
});
执行的结果如下:
E: developmentdocument odejsdemo >节点event-example.js
DATA1事件被处决…
已执行数据事件…
4、一次性事件监测
eventemiter可以听一次事件,和事件处理程序只会触发一次。之后,将被忽略,因为侦听程序被取消。
MyEmitterIns.once((数据)= > {
console.log(数据);
});
MyEmitterIns.emit(1,这是第一次打电话!;
MyEmitterIns.emit ('one','This is second call! ;
执行的结果如下:
E: developmentdocument odejsdemo >节点event-example.js
这是第一次通话!
正如你可以看到从上面的结果,the'one'event仅执行一次。
5。解除事件绑定
类似的事件,eventemiter也可以删除事件绑定,使用removelistener(事件,听者)删除一个事件绑定方法,所以听众回调函数必须指定函数,或找不到的功能,因为函数类型是引用类型,即使身体的功能是一样的,不一样的功能。如下所示:
MyEmitterIns.on(数据功能(e){
console.log(E);
});
MyEmitterIns.removeListener(数据功能(e){
console.log(E);
});
MyEmitterIns.emit(数据的数据,喂!);
函数处理(e){
console.log(E);
}
MyEmitterIns.on('data1处理);
MyEmitterIns.removeListener('data1处理);
MyEmitterIns.emit('data1,hello数据!);
执行的结果如下:
E: developmentdocument odejsdemo >节点event-example.js
你好,数据!
E: developmentdocument odejsdemo >
正如你可以看到从执行的结果,数据事件使用匿名函数,所以它没有被删除,和DATA1事件绑定成功。这里要注意的是发出触发一个事件,都与事件的回调函数将被调用,即使你使用一个回调函数中removelistener功能删除不使用另一个回调,但随后事件队列中移除的回调。如下图所示:
功能dealdata1(e){
console.log(数据事件执行…A);
}
MyEmitterIns.on(数据功能(e){
console.log(E);
MyEmitterIns.removeListener(资料,dealdata1);/ /来化解dealdata1结合
});
MyEmitterIns.on(资料,dealdata1);
MyEmitterIns.emit(数据,数据事件执行…;
*执行结果:
已执行数据事件…B
已执行数据事件…一
* /
/ /当事件被触发了,dealdata1已取消绑定回调
MyEmitterIns.emit(数据,数据的事件执行…;
执行了数据事件…
此外,您可以使用removealllisteners()将所有的事件。
6。获取事件侦听器的数量和监视功能
的emitter.listenercount(事件)的功能是用来获取指定事件的监听器数。功能emitter.listeners(事件)可以用来获得所有指定的事件侦听器函数。
var(CBA)= { },
=(CBB)= > { };
VaR发射器=新myemiter();
Emitter.on(数据,CBA);
Emitter.on(数据,CBB);
console.log(的the'emitter实例的数据事件将%d回调函数
console.log(他们是:',emitter.listeners(数据的));
执行的结果如下:
E: developmentdocument odejsdemo >节点event-example.js
发射器实例的数据事件绑定了2个回调函数。
他们是:{ {功能:CBA },{功能:CBB } }
7,获取并设置发射器侦听的最大数量。
Nodejs建议不超过10的听众对同一事件,可以在eventemitter.defaultmaxlisteners属性,如下所示:
console.log(EventEmitter。defaultmaxlisteners); / / 10
发射器的最大数量的听与getmaxlisteners()方法和最大数量的听的setmaxlisteners(n)的方法,如下图所示:
var(CBA)= { },
=(CBB)= > { };
VaR发射器=新myemiter();
(1)emitter.setmaxlisteners;
Emitter.on(数据,CBA);
Emitter.on(数据,CBB);
console.log(emitter.getmaxlisteners());
执行的结果如下:
E: developmentdocument odejsdemo >节点event-example.js
发射器事件的最大监视器数是:1。
(结:6808)警告:可能的内存泄漏检测EventEmitter。2数据的听众
附加。使用emitter.setmaxlisteners()增加限制
如上所示,如果设置了侦听器的最大数量,那么对同一事件的监视最好不要超过最大值,否则很可能会发送内存泄漏。
这是由活动模块介绍的,希望能对你的学习有所帮助,希望大家多多支持。