Node.js EventEmitter 之事件初探


Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。

Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。


EventEmitter 类

events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。

你可以通过require("events");来访问该模块。

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

EventEmitter 对象如果在实例化时发生错误,会触发 'error' 事件。当添加新的监听器时,'newListener' 事件会触发,当监听器被移除时,'removeListener' 事件被触发。

下面我们用一个简单的例子说明 EventEmitter 的用法:

//event.js 文件
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter();
event.on('some_event', 
function() {
 console.log('some_event 事件触发'); 
}); 
setTimeout(function() { 
event.emit('some_event'); }, 1000);

执行结果如下:

运行这段代码,1 秒后控制台输出了 'some_event 事件触发'。其原理是 event 对象注册了事件 some_event 的一个监听器,然后我们通过 setTimeout 在 1000 毫秒以后向 event 对象发送事件 some_event,此时会调用some_event 的监听器。

$ node event.js 
some_event 事件触发


 同理 如果我执行下面这个代码

var EventEmitter = require('events').EventEmitter;
var event = new EventEmitter();
var j=0;
event.on('some_event', function() {
    j++ ;
    console.log('some_event 事件触发',j);
});

for(var i=0;i<10;i++) {
    setTimeout(function () {

        event.emit('some_event');
        console.log(i) ;
    }, 100);
}

执行结果如下

22222.png


这样让大家能比较明白 事件的原理