扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
NodeJs的事件模块
成都创新互联专注于企业成都全网营销推广、网站重做改版、靖远网站定制设计、自适应品牌网站建设、H5场景定制、商城网站定制开发、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为靖远等各大城市提供网站开发制作服务。在爬虫代码中有个on('data')事件,为什么响应的res回有一个on方法呢,那这个on做什么事情呢,要回答这些问题,要从事件模块说起,在NodeJs中不存在浏览器中的冒泡、捕获这些行为的,所以NodeJs中实现的events这个模块,里面的大多数模块都集成了这个模块,
所以events是最重要的一个模块,它只对外暴露了一个对象,就是eventImit,作用有两个分别是事件的发射,和事件的监听,两个不同的执行环节本来是毫无联系的,但是有了事件模块的支持以后,这两个环节就能建立起联系,eventImit支持多个事件监听器,大值是10个,
就是在某个事件添加10个事件监听器;
var EventEmitter = require('events').EventEmitter var life = new EventEmitter() //addEventListener life.on('求安慰',function(who){ console.log('给'+who+'放水') }) life.on('求安慰',function(who){ console.log('给'+who+'揉肩') }) life.on('求安慰',function(who){ console.log('给'+who+'做饭') }) life.on('求安慰',function(who){ console.log('给'+who+'洗衣服') }) life.on('求安慰',function(who){ console.log('给'+who+'。。。。。。。。5') }) life.on('求安慰',function(who){ console.log('给'+who+'。。。。。。。。6') }) life.on('求安慰',function(who){ console.log('给'+who+'。。。。。。。。7') }) life.on('求安慰',function(who){ console.log('给'+who+'。。。。。。。。8') }) life.on('求安慰',function(who){ console.log('给'+who+'。。。。。。。。9') }) life.on('求安慰',function(who){ console.log('给'+who+'。。。。。。。。10') }) //触发 life.emit('求安慰','汉子')
运行结果如下:
如果绑定的事件多于10个呢,会怎样?
life.on('求安慰',function(who){ console.log('给'+who+'你想累死我啊') })
执行结果如下:
第11个监听器还是会执行的,但是会抛出了一个警告,那这个就是官方建议的,对于一个事件设置不要超过10个监听器,太多的话会导致内存的泄露,当然这个值是可以修改的,
那我们去修改一下事件所忍受的极限:
life.setMaxListeners(11) //添加在new对象之后,on之前
执行效果如下:
如果我对life注册另外一个事件,会不会占用这个大值?
代码如下:
life.on('求关爱',function(who){ console.log('给'+who+'买衣服') }) life.on('求关爱',function(who){ console.log('给'+who+'交工资') })
运行结果如下:
从运行结果发现:如果没有emit求关爱事件是不会触发监听函数的,
不是为所有事件统一分配的,只是为求安慰事件分配11个额度。
查看一个事件是否被监听过?
根据监听事件的返回值是个boolean类型
var flag1 = life.emit('求安慰','汉子') var flag2 = life.emit('求关爱','妹子') var flag3 = life.emit('求什么','汉子和汉子') console.log(flag1); console.log(flag2); console.log(flag3);
运行结果如下:
如何移除一个事件呢?
错误的写法:写在事件触发emit之前
life.removeListener('求安慰',function(){ console.log('给'+who+'放水') })
运行结果如下:
说明没有起作用。
那我们应该怎么写呢?匿名函数这种形式是不行的,需要写具名的函数。
改造如下:
function water(who){ console.log('给'+who+'放水') } //addEventListener life.on('求安慰',water) //移除 life.removeListener('求安慰',water)
运行结果如下:
移除事件成功。
查询剩余的事件监听数?
console.log(life.listeners('求安慰').length) console.log(EventEmitter.listenerCount(life,'求安慰'))
结果如下:
移除全部的监听:包括求关爱、求安慰的
life.removeAllListeners()
运行结果如下:
如果只想移除求安慰的,这个时候就需要传递具体的事件的名字的,
例如:
life.removeAllListeners('求安慰')
运行结果如下:
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流