NodeJS - 事件触发

Node中的许多对象会发出事件,例如net.Server每次发生连接时都会触发事件,而fs.readStream会在文件打开时触发事件,当用户提交表单的时候,通常会触发data和end事件。所有触发事件的对象都是events.EventEmitter的实例。


EventEmitter类

正如我们在上一节中看到的,EventEmitter类位于events模块中。它可以通过以下代码创建

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

当EventEmitter实例发生任何错误时,它会发出’error’事件。当添加一个新的侦听器时,’newListener’事件被触发,当一个侦听器被删除时,’removeListener’事件被触发。

EventEmitter提供了多个属性,如on和emit。on属性用于将函数与事件绑定,并使用emit来引发事件。

方法

  • addListener(event, listener) 为事件event 添加一个出发的函数listener,并且不会检查该事件是否已经有该listener。同时多次调用将导致监听器多次添加。函数返回该触发器,可以链式调用。同on相同,为on的别名函数
  • on(event, listener)功能和上边相同

  • once(event, listener)向事件添加一次性监听器。当事件被触发时才会调用此监听器,之后它将被删除。返回触发器,可以链式调用。

  • removeListener(event, listener)从指定事件的监听器数组中移除监听器。tips: 它更改监听器后面的监听器数组中的数组索引。removeListener将最多删除监听器数组中的一个监听器实例。如果任何单个监听器已多次添加到指定事件的监听器数组中,则必须多次调用removeListener才能删除每个实例。返回触发器,可以链式调用。

  • removeAllListeners([event])删除所有监听器或指定事件的监听器。返回触发器,可以链式调用。

  • setMaxListeners(n)默认情况下,如果为特定事件添加了超过10监听器,则EventEmitters将显示警告。不是所有的发射器都应该限制为10个。这个功能允许增加。

  • listeners(event)返回指定事件的监听器数组。

  • emit(event, [arg1], [arg2], […])使用提供的参数按顺序触发每个监听器。如果事件具有监听器,则返回true,否则返回false。

  • listenerCount(emitter, event)返回给定事件的所有监听器数量

例子如下:

var events = require('events');
var eventEmitter = new events.EventEmitter();

// listener1
var listner1 = function listner1() {
   console.log('listner1 executed.');
}

// listener2
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 = 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 = events.EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");

console.log("Program ended.");

运行结果

猜你喜欢

转载自blog.csdn.net/tian_123456789/article/details/79659339