今天还学习了 nodeJS 新的知识点就是 EventEmitter 模块的使用,利用 EventEmitter 同个事件添加多个监听器。下面就是多个事件监听的示例:
var EventEmitter = require('events').EventEmitter; var life = new EventEmitter(); life.on('Miss', function(who) { console.log('给 ' + who + ' 倒水'); }); life.on('Miss', function(who) { console.log('给 ' + who + ' 按摩'); }); life.on('Miss', function(who) { console.log('给 ' + who + ' 聊天'); }); life.emit('Miss', '汉子');
输出结果的截图
但官方建议在同个事件最多10个监听器,多了可能会造成内存泄露,所以默认情况下只能添加10个监听器,所以如果你超出了10个默认情况下会抛出警告信息的,但如果非要添加超过10个监听器也是可以的,只要在 new EventEmitter() 的下一行添加以下代码就可以实现
life.setMaxListeners(11); // 11 是最大额度
那么如何判断事件是否被监听过可以在 life.emit 前面加上赋值的变量,然后打印它的结果,但其输出是 true 时表示已经被监听过,但其输出是 false 时表示没有被监听过。
var isLife = life.emit('Miss', '汉子'); console.log(isLife);
输出结果的截图
那么如何移除一个监听器,将被移除的监听器中的方法移出来写在独立的 function 中,可以看下面的示例。
var EventEmitter = require('events').EventEmitter; var life = new EventEmitter(); life.setMaxListeners(11); function water(who) { console.log('给 ' + who + ' 倒水'); } life.on('Miss', water); life.on('Miss', function(who) { console.log('给 ' + who + ' 按摩'); }); life.on('Miss', function(who) { console.log('给 ' + who + ' 聊天'); }); life.removeListener('Miss', water); var isLife = life.emit('Miss', '汉子'); console.log(isLife);
其的输出结果如下图.
如果你认为一个个的移除比较的麻烦,可以使用以下的代码进行批量的移除操作了。这里会有个可填写的参数 type 这是用来输入事件名,可不输入,如果留空则全部都会被移除,如果填写上了只会移除输入了事件名的所有监听器
life.removeAllListeners([type]);
那么如何知道删除后还剩下多少个监听器,输入下两行中任意一行的代码,其输出的结果都一样。
console.log(life.listeners('Miss').length); console.log(EventEmitter.listenerCount(life, 'Miss'))
GITHUB地址:https://github.com/366065186/nodejs-demo/tree/master/events