Node.js从无到有-No.7(事件模块相关)

1、事件模块相关

1、在我们http基础那篇文章中我们就已经将了events模块的一些方法,包括.on()方法和.emit方法,现在我们回顾一下

var EventEmitter=require('events').EventEmitter//注意这里是events,不是event

var life=new EventEmitter()

life.on('求安慰',function(who){
    console.log('给'+who+'倒水')
})//第一个参数是事件的方法,第二个方法是回调函数

life.emit('求安慰','汉子')

上面的代码很好理解,我们首先监听了‘求安慰’这个事件,最后我们出发这个事件,并传递参数‘汉子’,看一下结果


2、对于同一个事件,我们可以有10给监听,即当事件发生的时候,10个回调函数都会被调用,如果我们有11个事件监听怎么办,我们将上面的代码中life.on的部分重复11遍,看看结果


实际的结果是第11个也能被打印出来,但是出现了警告,警告提示我们使用emitter.setMaxListeners()方法来改变监听数量上限。那我们去修改一下

var EventEmitter=require('events').EventEmitter//注意这里是events,不是event

var life=new EventEmitter()

life.setMaxListeners(11)

life.on('求安慰',function(who){
    console.log('给'+who+'倒水')
})//第一个参数是事件的方法,第二个方法是回调函数

life.on('求安慰',function(who){
    console.log('给'+who+'2')
})
life.on('求安慰',function(who){
    console.log('给'+who+'3')
})
life.on('求安慰',function(who){
    console.log('给'+who+'4')
})
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.on('求安慰',function(who){
    console.log('给'+who+'11')
})
life.emit('求安慰','汉子')

这下再去运行的时候就没有警告了。

3、我们注册的这个最大值上限为11,这个上限单纯指‘求安慰’事件的监听数量,我们使用life去注册另外一个名字的事件,它是不会占用这个上限值的,比如我们在上面代码的基础上再加两行

life.on('求溺爱',function(who){
    console.log('给'+who+'买衣服')
})
life.on('求溺爱',function(who){
    console.log('给'+who+'买包包')
})
life.emit('求溺爱','妹子')

结果一定是正常显示,大家可以去试试

4、那么如果查看某个事件被监听过呢?通过bool值就可以知道,实际上emit()方法会返回一个bool值

var hasConfortListener=life.emit('求安慰','汉子')
通过这样方法我们就将事件是否别监听过的bool值赋值给hasConfortListener,打印出来就知道了
var hah=life.emit('求溺爱','妹子')
var haha=life.emit('求安慰','汉子')
var haahh=life.emit('被玩坏')
console.log(hah,haha,haahh)

很显然结果是true ture false

5,如何移除一个事件监听呢,通过removeListener来实现,还有一个方法是移除该事件的所有监听removeAlllistener

life.removeAllListeners('求安慰') //移除求安慰事件的所有监听

下面说说通过removeListener怎么实现移除某个监听,事实就是removeListener不能移除回调方法是匿名方法的监听,什么意思,就是说通过下面这种方法是没有用的

life.removeListener('求溺爱',function(who){
    console.log('给'+who+'买衣服')
})

只有回调函数是个具名函数才行,也就说下面这种方法才是正确的

function water(who){
    console.log('给'+who+'倒水')
}
life.on('求安慰',water)//第一个参数是事件的方法,第二个方法是回调函数
life.removeListener('求安慰',water)

6、怎么知道当前监听事件的监听器的个数呢?下面两种方法都是可行的

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




猜你喜欢

转载自blog.csdn.net/weixin_37968345/article/details/80775142