手记

Node.js EventEmitter (触发器)

Node.js EventEmitter


Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列.
Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。

EventEmitter 类


events 模块只提供了一个内部类: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。你可以通过require("events");来访问该模块。创建一个文件叫做emitter.js:

//创建EventEmitter类
var EventEmitter = require('events').EventEmitter();
//创建eventEmitter对象
var eventEmitter = new EventEmitter();
eventEmitter.on('bomb',function(){
      //观察者为匿名函数,事件为bomb
      console.log('bomb已经引爆');
})

//创建bomb之后就是要引爆它了,这里牵扯到事件的触发
setTimeout(function(){
      eventEmitter.emit('bomb');
},1000);

执行结果如下:
运行这段代码,1 秒后控制台输出了 '事件触发'。其原理是 event 对象注册了事件 bomb 的一个监听器,然后我们通过 setTimeout 在 1000 毫秒以后 event 对象触发事件bomb,此时会调用bomb的监听器(匿名函数)。

$ node emitter.js
bomb已经引爆

eventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。
让我们以下面的例子解释这个过程:

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

 eventEmitter.on('bobm',function(args1,args2){
       console.log('bomb引燃,引燃使用的是:'+args1+" 和"+arg2);
 });

eventEmitter.on('bobm',function(args1,args2){
       console.log('bomb引燃,使用的是:'+args1+"或者 "+arg2);
 });

执行以上代码,运行的结果如下:

$ node event.js
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数

以上例子中,emitter 为事件 someEvent 注册了两个事件监听器,然后触发了 someEvent 事件。
运行结果中可以看到两个事件监听器回调函数被先后调用。 这就是EventEmitter最简单的用法。
EventEmitter 提供了多个属性,如 on 和 emiton 函数用于绑定事件函数,emit 属性用于触发一个事件。

1人推荐
随时随地看视频
慕课网APP