资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

Node.js(十)——NodeJs事件

NodeJs的事件模块

十年的武川网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销的优势是能够根据用户设备显示端的尺寸不同,自动调整武川建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联公司从事“武川网站设计”,“武川网站推广”以来,每个客户项目都认真落实执行。

在爬虫代码中有个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('求安慰','汉子')

运行结果如下:

Node.js(十)——NodeJs事件

如果绑定的事件多于10个呢,会怎样?

life.on('求安慰',function(who){
	console.log('给'+who+'你想累死我啊')
})

执行结果如下:

Node.js(十)——NodeJs事件

第11个监听器还是会执行的,但是会抛出了一个警告,那这个就是官方建议的,对于一个事件设置不要超过10个监听器,太多的话会导致内存的泄露,当然这个值是可以修改的,

那我们去修改一下事件所忍受的极限:

life.setMaxListeners(11)

//添加在new对象之后,on之前

执行效果如下:

Node.js(十)——NodeJs事件

如果我对life注册另外一个事件,会不会占用这个最大值?

代码如下:

life.on('求关爱',function(who){
	console.log('给'+who+'买衣服')
})
life.on('求关爱',function(who){
	console.log('给'+who+'交工资')
})

运行结果如下:

Node.js(十)——NodeJs事件

从运行结果发现:如果没有emit求关爱事件是不会触发监听函数的,

不是为所有事件统一分配的,只是为求安慰事件分配11个额度。

查看一个事件是否被监听过?

根据监听事件的返回值是个boolean类型

var flag1 = life.emit('求安慰','汉子')
var flag2 = life.emit('求关爱','妹子')
var flag3 = life.emit('求什么','汉子和汉子')

console.log(flag1);
console.log(flag2);
console.log(flag3);

运行结果如下:

Node.js(十)——NodeJs事件

如何移除一个事件呢?

错误的写法:写在事件触发emit之前

life.removeListener('求安慰',function(){
	console.log('给'+who+'放水')
})

运行结果如下:

Node.js(十)——NodeJs事件

说明没有起作用。

那我们应该怎么写呢?匿名函数这种形式是不行的,需要写具名的函数。

改造如下:

function water(who){
	console.log('给'+who+'放水')
}

//addEventListener
life.on('求安慰',water)

//移除
life.removeListener('求安慰',water)

运行结果如下:

Node.js(十)——NodeJs事件

移除事件成功。

查询剩余的事件监听数?

console.log(life.listeners('求安慰').length)
console.log(EventEmitter.listenerCount(life,'求安慰'))

结果如下:

Node.js(十)——NodeJs事件

移除全部的监听:包括求关爱、求安慰的

life.removeAllListeners()

运行结果如下:

Node.js(十)——NodeJs事件

如果只想移除求安慰的,这个时候就需要传递具体的事件的名字的,

例如:

life.removeAllListeners('求安慰')

运行结果如下:

Node.js(十)——NodeJs事件


新闻名称:Node.js(十)——NodeJs事件
链接地址:http://www.cdkjz.cn/article/jojdih.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220