手机版

跟我学Nodejs (2)-Node.js事件模块

时间:2021-11-07 来源:互联网 编辑:宝哥软件园 浏览:

而materials http://nodejs . org/API/events . html http://www . infoq.com/cn/articles/tyq-nodejs-event events是node.js最重要的模块,events模块只提供一个对象,events。事件发射器事件发射器的核心是事件发射和事件监听器。Node.js中的大多数模块都是从事件模块继承而来的。与DOM树上的事件不同,没有事件冒泡和逐层捕获。事件发射器支持多个事件侦听器。当一个事件被启动时,注册到该事件的事件监听器被依次调用,事件参数作为回调函数参数被传递。如何访问:复制代码如下: require(' events ');发射器打开(事件,监听器)

复制代码如下:/*调用事件模块并获取事件。EventEmitter对象*/var event emitter=require(' events ')。var ee=new event emitter();/* eventemitter.on (event,listener)注册监听参数1:事件字符串,事件名称参数2:回调函数*/ee.on ('some _ events ',function (foo,bar) {console.log('第一个监听事件,参数foo=' foo ',bar=。});Console.log('第一轮');ee.emit('some_events ',' Wilson ',' Zhong ');Console.log('第二轮');ee.emit('some_events ',' Wilson ',' Z ');EventEmitter.on(事件,侦听器)示例源代码emitter.emit(事件,[arg1],[arg2],[.])

复制代码如下: var event emitter=require(' events ')。eventemittervar ee=new event emitter();EE.on ('some _ events ',function (foo,bar) {console.log('第一个监听事件,参数foo=' foo ',bar=' bar ');});/* event发射器。emit(事件,[arg1],[arg2],[.】)触发指定的事件参数1:事件字符串,事件名称参数2:可选参数,按顺序传递的回调函数的参数返回值:事件是否被监控*/var为success=ee。发出(' some _ events ','。EE。On ('some _ events ',function (foo,bar) {console.log('第二个侦听事件,参数foo=' foo ',bar=' bar ');});ee.emit('some_events ',' zhong ',' Wei ');var issueccess2=ee . emit(' other _ events ',' Wilson ',' Zhong ');console . log(issueccess);console . log(issueccess2);发射器。emit(事件,[arg1],[arg2],[.】)示例源代码已经触发了三次事件,其中有些_events注册监听,emit函数在调用时会返回true,而其他_events没有注册监听,emit函数会返回false,表示事件没有监听;当然,不用担心这个返回值!发射器.一次(事件,收听者)

复制代码如下: var event emitter=require(' events ')。eventemittervar ee=new event emitter();/* event发射器。once (event,listener)为事件注册一次性监控,触发一次后,移除监控参数1:事件字符串,事件名称参数2:回调函数*/ee。once ('some _ events ',function (foo,bar) {console.log('第一个监视事件,参数foo=')。});Console.log('第一轮');ee.emit('some_events ',' Wilson ',' Zhong ');Console.log('第二轮');var issueccess=ee . emit(' some _ events ',' Wilson ',' Zhong ');console . log(issueccess);Emitter.once(event,listener)示例源代码从上面示例代码的执行结果可以看出,在Emitter注册了some_events的侦听器之后。一次,两轮触发调用emitter.emit,第二轮返回false;这意味着向发射器. once注册监控与向发射器. on注册监控略有不同,后者是一次性监控。一旦触发,监控将被移除!当然,从名字上就很明显了_!发射器。移除监听器(event,listener)我们先来看一个失败的场景~ ~ ~

复制代码如下: var event emitter=require(' events ')。eventemittervar ee=new event emitter();EE.on ('some _ events ',function (foo,bar) {console.log('第一个监听事件,参数foo=' foo ',bar=' bar ');});/*当我在API中看到removeListener移除方法时,我以为应该是这样的,结果却是_!*/ee。removelistener ('some_events ',function () {console.log('成功删除了事件some_events侦听!'。);});Console.log('第一轮');ee.emit('some_events ',' Wilson ',' Zhong ');发射器。removelistener (event,listener)示例失败场景源代码当我用emitter.on注册了一个some_events的监视器时,我用emiiter.removeListener删除了some_events的监视器,然后调用emitter.emit进行触发,最后发现并没有按照我的想象进行!为什么呢?我想当然的认为emiiter.removeListener的第二个参数是回调函数,所以API要仔细看!再来看看另一个成功的场景~ ~ ~

复制代码如下: var event emitter=require(' events ')。eventemittervar ee=new event emitter();Varlistener=function (foo,bar) {console.log('第一个侦听事件,参数foo=' foo ',bar=' bar ');} varlistener 2=function (foo,bar) {console.log('第二个侦听事件,参数foo=' foo ',bar=' bar ');} varlistener 3=function (foo,bar) {console.log('第三个侦听事件,参数foo=' foo ',bar=' bar ');}ee.on('some_events ',listener);ee.on('some_events ',listener 2);ee.on('some_events ',listener 3);/* event发射器。removelistener(事件,侦听器)删除指定事件的侦听器。注意:侦听器必须是注册的PS:在前面的示例之后,它将失败。最大的原因是听者被忽略了。传递一个事件名称是理所当然的,所以是悲剧!*/ee . removelistener(' some _ events ',listener);ee.removeListener('some_events ',listener 3);ee.emit('some_events ',' Wilson ',' Zhong ');发射器。remove listener (event,listener)示例成功的场景源代码我在示例中写了,给some_events增加了三个监视器,去掉了第一个和第三个监视器,最后用emitter.emit触发了some_events,输出结果不难发现。发射器移除的第一个和第三个监视器再次不起作用,这是有害的。emitter.removeListener的第二个参数是要移除的监视器,而不是成功移除后的回调函数… _!发射器。移除所有监听器([事件])发射器。已经使用了remove侦听器,但是一个事件可以有多个侦听器。当所有的都需要去掉的时候,一个个去掉显然是不愉快的,不符合懒惰的天性!让我们体验一下emitter.removeAllListeners带来的便利吧!

复制代码代码如下: var事件发射器=必需(“事件”).事件发射器;var ee=新事件发射器();var listener=function(foo,bar){ console.log('第一个监听事件,参数foo=' foo ',bar=' bar ');}var listener2=function(foo,bar){ console.log('第2个监听事件,参数foo=' foo ',bar=' bar ');}ee.on('some_events ',listener);ee.on('some_events ',侦听器2);ee.on('other_events ',function(foo,bar){ console.log('其它监听事件,参数foo=' foo ',bar=' bar ');});/*事件发射器。移除所有侦听器([事件])移除(批定事件)所有监听器参数1:可选参数,事件字符串,事件名*/ee。移除所有侦听器(' some _ events ');ee.emit('some_events ',' Wilson ',' Zhong ');ee.emit('other_events ',' Wilson ',' Zhong ');发射器。removeall侦听器传入事件名参数示例源码看看上面的执行结果,你会发现给一些事件注册了两个监听;给其他事件注册了一个监听;我调用发射器。removeall侦听器传了一些事件事件名;最后使用发射器打开函数触发一些事件和其他事件两个事件,最后发现一些事件注册的两个监听都不存在,而其他事件注册的监听还存在;这表示当发射器。removeall侦听器传用事件名作为参数时,为移除传入事件名的所有监听,而不会影响其它事件监听!发射器。removeall侦听器可以不传用事件名参数;直接执行

复制代码代码如下: var事件发射器=必需(“事件”).事件发射器;var ee=新事件发射器();var listener=function(foo,bar){ console.log('第一个监听事件,参数foo=' foo ',bar=' bar ');}var listener2=function(foo,bar){ console.log('第2个监听事件,参数foo=' foo ',bar=' bar ');}ee.on('some_events ',listener);ee.on('some_events ',侦听器2);ee.on('other_events ',function(foo,bar){ console.log('其它监听事件,参数foo=' foo ',bar=' bar ');});/*事件发射器。移除所有侦听器([事件])移除(批定事件)所有监听器参数1:可选参数,事件字符串,事件名*/ee。removeall侦听器();ee.emit('some_events ',' Wilson ',' Zhong ');ee.emit('other_events ',' Wilson ',' Zhong ');发射器。removeall侦听器不传参数示例源码示例代码和传入参数时几乎一样,只是在调用发射器。removeall侦听器并没有传入指定事件名;运行结果会发现一些事件和其他事件所有监听都不存在了,它会移除所有监听!(比较暴力的方法一般要慎用~~)发射器。接收器(事件)

复制代码代码如下: var事件发射器=必需(“事件”).事件发射器;var ee=新事件发射器();var listener=function(foo,bar){ console.log('第一个监听事件,参数foo=' foo ',bar=' bar ');}var listener2=function(foo,bar){ console.log('第2个监听事件,参数foo=' foo ',bar=' bar ');}ee.on('some_events ',listener);ee.on('some_events ',侦听器2);ee.on('other_events ',function(foo,bar){ console.log('其它监听事件,参数foo=' foo ',bar=' bar ');});/* EventEmitter.listeners(事件)//返回指定事件的监听数组参数1:事件字符串,事件名*/var listenereventsar=ee。侦听器(' some _ events ');控制台。日志(listenereventsarr。长度)为(var I=listenereventsarr。长度-1;I=0;I-){控制台。日志(listenereventsar[I]);};发射器。监听器(事件)示例源码给一些事件注册两个监听,调用发射器。监听器函数,传入一些事件事件名,接收函数返回值;从结果可以看出,返回值接收到一些事件所有注册监听的集合!emitter.setMaxListeners(n)一个事件可以添加多个监听是没错,但Nodejs默认最大值是多少呢?

复制代码如下: var event emitter=require(' events ')。eventemittervar ee=new event emitter();/*将11个侦听器添加到event emitter */for(var I=10;I=0;I-) {ee.on ('some _ events ',function(){ console . log(' the first '(I 1)' listing ');});};添加n个监听示例源代码在上面的例子中,我用了一个循环添加了11个监听some_events,执行了代码,发现出现了警告信息,而且提示比较详细,所以需要使用emitter.setMaxListeners()来提升限制

复制代码如下: var event emitter=require(' events ')。eventemittervar ee=new event emitter();/*事件发射器。setmaxlisteners (n)为eventemitter设置最大监控参数1: n。当监视器的最大数量超过10个监视器时,设置事件发射器的最大侦听器数量将提示:(节点)警告:检测到可能的事件发射器内存泄漏。添加了11个侦听器。提高限度。设计者认为监听器太多,可能导致内存泄漏,所以有这样的警告*/ee . setmaxlisteners(15);/*将11个侦听器添加到event emitter */for(var I=10;I=0;I-) {ee.on ('some _ events ',function(){ console . log(' the first '(I 1)' listing ');});};Emitter.setMaxListeners示例源代码当我调用emitter.setMaxListeners传入15时,代码被执行,警告消息不再出现;emitter.setMaxListeners的功能是设置EventEmitter的最大侦听器数量。感觉一般没必要设置这个值,10个不够的情况应该比较少!设计师认为听众太多会导致内存泄漏,所以给了警告!其他人.如果用得少,我就不细说了。事件发射器的功能。defaultmaxlisteners event emitter。defaultmaxlisteners类似于setMaxListeners。将所有事件发射器的最大侦听setMaxListeners优先级设置为大于defaultmaxlistener seventermitter . listener count(发射器,事件)返回指定事件的受监视数量。特殊事件error引用自Node.js的开发指南:EventEmitter定义了一个特殊事件error,其中包含了“Error”的语义含义。当我们遇到异常时,我们通常会启动错误事件。传输错误时,EventEmitter规定如果没有对应的监听器,Node.js会将其作为异常,退出程序,打印调用栈。一般来说,我们应该为能够发出错误事件的对象设置监听器,以避免整个程序在遇到错误后崩溃。事件的继承将包含在util中,感兴趣的可以自己看看http://nodejs.org/API/util.html # util _ util _ inherits _ constructor _ super-constructor。

版权声明:跟我学Nodejs (2)-Node.js事件模块是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。