Node.js 事件发射器
-
事件发射器
Node中的许多对象都会发出事件,例如net.Server每次对等点连接到它时都会发出一个事件,而fs.readStream在文件打开时会发出一个事件。发出事件的所有对象都是events.EventEmitter的实例。 -
EventEmitter类
如上一节所述,EventEmitter类位于事件模块中。可通过以下代码访问-// 导入 events 模块 var events = require('events'); // 创建 eventEmitter 对象 var eventEmitter = new events.EventEmitter();
当EventEmitter实例遇到任何错误时,它将发出“error”事件。添加新的侦听器时,将触发“newListener”事件,而删除侦听器时,将触发“removeListener”事件。EventEmitter提供多个属性,如on和emit。on属性用于将函数与事件绑定,emit用于触发事件。方法 描述 addListener(event, listener) 在侦听器数组的末尾为指定事件添加一个侦听器。不检查是否已添加侦听器。通过事件和侦听器的相同组合的多个调用将导致侦听器被多次添加。返回发射器,因此可以链接调用。 on(event, listener) 在侦听器数组的末尾为指定事件添加一个侦听器。不检查是否已添加侦听器。通过事件和侦听器的相同组合的多个调用将导致侦听器被多次添加。返回发射器,因此可以链接调用。 once(event, listener) 向事件添加一次侦听器。仅在下次触发事件时才调用此侦听器,然后将其删除。返回发射器,因此可以链接调用。 removeListener(event, listener) 从侦听器数组中删除指定事件的侦听器。注意-它将更改侦听器后面的侦听器数组中的数组索引。 removeListener最多将从侦听器数组中删除一个侦听器实例。如果已针对指定事件多次将任何单个侦听器添加到侦听器数组,则必须多次调用removeListener才能删除每个实例。返回发射器,因此可以链接调用。 removeAllListeners([event]) 删除所有侦听器,或指定事件的侦听器。删除添加在代码其他位置的侦听器不是一个好主意,尤其是当侦听器位于您未创建的发射器上时(例如套接字或文件流)。返回发射器,因此可以将调用链接起来setMaxListeners(n)默认情况下,如果为特定事件添加了10个以上的侦听器,则EventEmitters将打印警告。这是一个有用的默认值,有助于查找内存泄漏。显然,并非所有发射器都应限制为10个。此功能可以增加该发射器。设置为零表示无限。 listeners(event) 返回指定事件的侦听器数组。 emit(event, [arg1], [arg2], [...]) 使用提供的参数按顺序执行每个侦听器。如果事件具有侦听器,则返回true,否则返回false。 -
类方法
方法 描述 listenerCount(emitter, event) 返回给定事件的侦听器数。 -
事件
事件 描述 newListener - event − String: 事件名称
- listener − Function: 事件处理函数
removeListener - event − String: 事件名称
- listener − Function: 事件处理函数
-
示例
使用以下Node.js代码创建一个名为main.js的js文件-
尝试一下var events = require('events'); var eventEmitter = new events.EventEmitter(); // listener #1 var listner1 = function listner1() { console.log('listner1 执行.'); } // listener #2 var listner2 = function listner2() { console.log('listner2 执行.'); } // 将connection事件与listner1函数绑定 eventEmitter.addListener('connection', listner1); // 将connection事件与listner2函数绑定 eventEmitter.on('connection', listner2); var eventListeners = require('events').EventEmitter.listenerCount (eventEmitter,'connection'); console.log(eventListeners + " 侦听器正在监听connection事件"); // 触发connection事件 eventEmitter.emit('connection'); // 删除listner1函数的绑定 eventEmitter.removeListener('connection', listner1); console.log("Listner1 现在不不在侦听."); // 触发connection事件 eventEmitter.emit('connection'); eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection'); console.log(eventListeners + " 侦听器正在监听connection事件"); console.log("程序终止.");
$ node main.js
应该产生以下结果-2 侦听器正在监听connection事件 listner1 执行. listner2 执行. Listner1 现在不不在侦听. listner2 执行. 1 侦听器正在监听connection事件 程序终止.