Node中的许多对象都会发出事件,例如net.Server每次对等体连接时都会发出一个事件,fs.readStream会在打开文件时发出一个事件.发出事件的所有对象都是events.EventEmitter的实例.
正如我们在上一节中看到的,EventEmitter类位于事件模块.它可以通过以下代码访问 :
//导入事件模块 var events = require('events'); //创建一个eventEmitter对象 var eventEmitter = new events.EventEmitter();
当EventEmitter实例面临任何错误时,它会发出"错误"事件.添加新侦听器时,会触发"newListener"事件,并且在删除侦听器时会触发"removeListener"事件.
EventEmitter提供多个属性,如 on 和发出. on 属性用于将函数与事件绑定, emit 用于触发事件.
Sr.No. | 方法&描述 |
---|---|
1 | addListener(event, listener) 在侦听器数组的末尾为指定的事件添加侦听器.不进行检查以查看是否已添加侦听器.传递相同事件和侦听器组合的多个调用将导致多次添加侦听器.返回发射器,因此可以链接调用. |
2 | on(event, listener) 在监听器末尾添加一个监听器指定事件的数组.不进行检查以查看是否已添加侦听器.传递相同事件和侦听器组合的多个调用将导致多次添加侦听器.返回发射器,因此可以链接调用. |
3 | once(event, listener) 为事件添加一次性监听器.只有在下次触发事件时才会调用此侦听器,之后将其删除.返回发射器,因此可以链接调用. |
4 | removeListener(event,listener) 从侦听器数组中删除侦听器指定的事件. 警告: 它更改侦听器后面的侦听器数组中的数组索引. removeListener最多会从侦听器数组中删除一个侦听器实例.如果已将多个单个侦听器多次添加到指定事件的侦听器数组,则必须多次调用removeListener以删除每个实例.返回发射器,因此可以链接调用. |
5 | removeAllListeners([event]) 删除所有侦听器或指定的侦听器事件.删除代码中其他位置添加的侦听器并不是一个好主意,尤其是当它在您未创建的发射器上时(例如套接字或文件流).返回发射器,因此可以链接调用. |
6 | setMaxListeners(n) 默认情况下,EventEmitters会在超过为特定事件添加了10个听众.这是一个有用的默认值,可帮助查找内存泄漏.显然不是所有发射器都应限制在10.此功能允许增加.设为零无限制. |
7 | listeners(event) 返回指定事件的侦听器数组. |
8 | emit(event, [arg1], [arg2], [...]) 按顺序执行每个侦听器参数.如果事件有侦听器,则返回true,否则返回false. |
Sr.No. | 方法&描述 |
---|---|
1 | listenerCount(emitter, event) 返回给定事件的侦听器数量. |
Sr.No. | 活动&说明 |
---|---|
1 | newListener
每次添加侦听器时都会发出此事件.触发此事件时,可能尚未将侦听器添加到事件的侦听器数组中. |
2 | removeListener
每当有人删除侦听器时都会发出此事件.触发此事件时,可能尚未从该事件的侦听器数组中删除侦听器. |
创建一个名为main.js的js文件,其中包含以下Node.js代码 :
var events = require('events'); var eventEmitter = new events.EventEmitter(); // listener #1 var listner1 = function listner1() { console.log('listner1 executed.'); } // listener #2 var listner2 = function listner2() { console.log('listner2 executed.'); } // Bind the connection event with the listner1 function eventEmitter.addListener('connection', listner1); // Bind the connection event with the listner2 function eventEmitter.on('connection', listner2); var eventListeners = require('events').EventEmitter.listenerCount (eventEmitter,'connection'); console.log(eventListeners + " Listner(s) listening to connection event"); // Fire the connection event eventEmitter.emit('connection'); // Remove the binding of listner1 function eventEmitter.removeListener('connection', listner1); console.log("Listner1 will not listen now."); // Fire the connection event eventEmitter.emit('connection'); eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection'); console.log(eventListeners + " Listner(s) listening to connection event"); console.log("Program Ended.");
现在运行main.js查看结果 :
$ node main.js
验证输出.
2 Listner(s) listening to connection event listner1 executed. listner2 executed. Listner1 will not listen now. listner2 executed. 1 Listner(s) listening to connection event Program Ended.