事件处理机制及事件环机制
现在介绍 nodejs的事件相关内容。
接触过编程的同学应该在了解,在访问任何网页的时候,会伴随着许多的事件,例如点击菜单,移动鼠标等等。那么nodejs是如何处理的?
这里需要介绍EventEmitter类
EventEmitter类
在Nodejs中用于实现各种事件处理的event模块中,定义了一个EventEmitter类。所有可能触发事件的对象都是一个继承了EventEmitter类的子类的实例对象。
介绍下EventEmitter类的方法
方法名与参数 | 描述 |
addListener(event, listener) | 对指定时间绑定事件处理函数 |
on(event, listener) | addListener别名 |
once(event, listener) | 对指定时间绑定只处理一次的事件处理函数 |
removeListener(event, listener) | 对指定事件解除处理函数 |
removeAllListener([event]) | 对指定的事件解除所有事件处理函数 |
setMaxListeners(N) | 指定事件处理函数的最大数量 |
listeners(event) | 获取制定事件的所有事件处理函数 |
emit(event,[arg1],[...]) | 手工触发指定事件 |
EventEmitter类的各个方法
/**
* Created by wanq on 14/11/15.
*/
var http = require('http');
var server = http.createServer();
server.on('request', function (req, res) {
if (req.url !== '/favicon.ico') {
console.log(req.url);
}
res.end();
})
server.listen(1337, '127.0.0.1');
获取指定事件的事件处理函数的数量
EventEmitter类自身有个listenerCount方法,可以用来吼去某个对象的指定事件的事件处理函数的数量。
/**
* Created by wanq on 14/11/15.
*/
var http = require('http');
var events = require('events');
var server = http.createServer();
server.on('request', function (req, res) {
if (req.url !== '/favico.ico') {
console.log(req.url);
}
res.end();
});
server.listen(1337, '127.0.0.1');
console.log(events.EventEmitter.listenerCount(server, 'request'));
EventEmitter类自身所拥有的事件
在events模块中,EventEmitter类本身定义了两个事件:newListener事件与removerListener事件。
/**
* Created by wanq on 14/11/15.
*/
var http = require('http');
var server = http.createServer();
server.on('request', function (req, res) {
if (req.url !== '/favico.ico') {
console.log(req.url);
}
res.end;
});
server.on('removeListener', function (e, f) {
console.log("对"+e + "事件取消事件处理函数"
)
;
console.log(f);
});
server.on('newListener', function (e, f) {
console.log("对"+e + "事件添加事件处理函数"
)
;
console.log(f);
});
var testFunction = function (req, res) {
console.log(req.url);
};
server.on('request', testFunction);
server.removeListener('request', testFunction);
server.listen(1337, '127.0.0.1');
事件环机制
事件环机制的意思是,你在实现的时候,触发的事件会形成一个个环。具体点就是,就像你在厨房做饭,你要干的活为洗菜,煮饭,炒菜。
正常的顺序为:洗菜,煮饭,炒菜。
但是你可以先淘米,之后就放在电饭煲里煮饭,到饭熟的这段时间,你可以洗菜,之后就炒菜了。不用等饭熟了在炒菜。
同样的nodejs中也是同样的,当你触发了一个事件的时候,不用什么都不用做,可以处理其他的业务,等那个事件处理完成,会调用回调函数的,处理完回调函数,就形成了一个事件环了。
所以nodejs中会形成许多的事件环。
这也依赖于nio机制,不用等待处理完才能继续执行回调函数。