Node.js EventEmmitter事件监听器用法实例分析
本文实例讲述了Node.jsEventEmmitter事件监听器用法。分享给大家供大家参考,具体如下:
Node.js所有的异步I/O操作在完成时都会发送一个事件到事件队列。
events模块只提供了一个对象:events.EventEmitter。EventEmitter的核心就是事件触发与事件监听器功能的封装。
该模块已被node.js默认引,不需要使用require()显示引入。
EventEmitter对象如果在实例化时发生错误,会触发‘error'事件。当添加新的监听器时,'newListener'事件会触发,当监听器被移除时,'removeListener'事件被触发。
一、on(event,listener)
为指定事件注册一个监听器,接受一个字符串event和一个回调函数。
varmyEvent=newevents.EventEmitter(); varlistener=function(){ console.log('someEventemit'); } myEvent.on('someEvent',listener); //这里是lambda表达式 setTimeout(()=>myEvent.emit('someEvent'),1000);
EventEmitter的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter支持若干个事件监听器。
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。
varmyEvent=newevents.EventEmitter(); myEvent.on('someEvent',function(arg1,arg2){console.log('someEvent1emit',arg1,arg2);}); myEvent.on('someEvent',(arg1,arg2)=>console.log('someEvent2emit',arg1,arg2)); myEvent.emit('someEvent','arg1','arg2'); /* 输出 someEvent1emitarg1arg2 someEvent2emitarg1arg2 */
二、once(event,listener)
为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。
varmyEvent=newevents.EventEmitter(); myEvent.once('someEvent',function(){ console.log('someEventemit'); }); myEvent.emit('someEvent'); /* 返回true 输出someEventemit */ myEvent.emit('someEvent'); //返回false
三、removeListener(event,listener)
移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。
varmyEvent=newevents.EventEmitter(); varlistener=()=>console.log('someEventemit'); myEvent.on('someEvent',listener); myEvent.removeListener('someEvent',listener); myEvent.emit('someEvent'); //返回false
四、removeAllListeners([event])
移除所有事件的所有监听器,如果指定事件,则移除指定事件的所有监听器。
五、setMaxListeners(n)
默认情况下,EventEmitters如果你添加的监听器超过10个就会输出警告信息。setMaxListeners函数用于提高监听器的默认限制的数量。
六、listenerCount(emitter,event)
返回指定事件的监听器数量。
varmyEvent=newevents.EventEmitter(); myEvent.listenerCount(); //输出0 events.EventEmitter.listenerCount(myEvent); //输出0 events.EventEmitter.listenerCount(myEvent,'someEvent'); //输出0 myEvent.on('someEvent',()=>console.log('someEventemit')); myEvent.listenerCount(); //输出0 events.EventEmitter.listenerCount(myEvent); //输出0 events.EventEmitter.listenerCount(myEvent,'someEvent'); //输出1
七、error事件
EventEmitter定义了一个特殊的事件error,它包含了错误的语义,我们在遇到异常的时候通常会触发error事件。
当error被触发时,EventEmitter规定如果没有响应的监听器,Node.js会把它当作异常,退出程序并输出错误信息。
我们一般要为会触发error事件的对象设置监听器,避免遇到错误后整个程序崩溃。
varmyEvent=newevents.EventEmitter(); myEvent.on('uncaughtException',(err)=>{ console.log('whoops!therewasanerror'); }); myEvent.emit('error',newError('whoops!')); //输出Error:whoops! myEvent.on('error',(err)=>{ console.log('whoops!therewasanerror'); }); myEvent.emit('error',newError('whoops!')); //输出whoops!therewasanerror
注意
大多数时候我们不会直接使用EventEmitter,而是在对象中继承它。包括fs、net、http在内的,只要是支持事件响应的核心模块都是EventEmitter的子类。
为什么要这样做呢?原因有两点:
2.JavaScript的对象机制是基于原型的,支持部分多重继承,继承EventEmitter不会打乱对象原有的继承关系。
Events(事件)模块是Node.js的核心,许多其他模块用它来围绕着事件架构功能。由于Node.js运行在单一的线程中,任何同步代码都是阻塞的,所以如果有长时间运行的代码的话事件循环便会被阻塞。为了有效地使用Node.js编写代码,必须仔细思考自己的变成风格并遵循一些简单的规则。
- 别阻塞——Node.js是单线程的,如果代码阻塞的话所有其他的一切都会停止。
- 快速返回——操作应当快速返回。如果不能快速返回,就应道将其移到另一个进程中。
希望本文所述对大家nodejs程序设计有所帮助。