nodejs笔记3(EventEmitter)
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。
1.EventEmitter 类
events是nodejs中的一个模块,它可以提供一个对象 events.EventEmitter()
EventEmitter的核心功能就是事件触发器和事件监听了。
同样的我们可以通过 require('events') 来获取该模块
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
EventEmitter 对象如果在实例化时发生错误,会触发 error 事件。当添加新的监听器时,newListener 事件会触发,当监听器被移除时,removeListener 事件被触发。
2.event demo
event在一秒后执行 some_event
event监听 some_event,此时进行回调,打印结果。
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);
EventEmitter 的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter 支持 若干个事件监听器。
当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。
3.EventEmitter各种方法介绍
①addListener(event, listener)
为指定的事件添加监听器
②on(event, listener)
为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。
server.on('connection', function (stream) {
console.log('someone connected!');
});
③once(event, listener)
为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。
server.once('connection', function (stream) {
console.log('Ah, we have our first user!');
});
④removeListener(event, listener)
移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。
它接受两个参数,第一个是事件名称,第二个是回调函数名称。
var callback = function(stream) {
console.log('someone connected!');
};
server.on('connection', callback);
server.removeListener('connection', callback);
⑤removeAllListeners([event])
移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。
⑥setMaxListeners(n)
默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。
⑦listeners(event)
返回指定事件的监听器数组。
⑧emit(event, [arg1], [arg2], [...])
按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false。
4.EventEmitter demo
var events = require('events');
var eventEmitter = new events.EventEmitter();
//监听器1
var listener1 = function listener1(){
console.log('监听器 listener1 执行')
}
//监听器2
var listener2 = function listener2(){
console.log('监听器 listener2 执行')
}
// 绑定 connection 事件,处理函数为 listener1
eventEmitter.addListener('connection',listener1);
// 绑定 connection 事件,处理函数为 listener2
eventEmitter.on('connection', listener2);
var eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners+"个 监听器监听连接事件")
//触发 connection 事件
eventEmitter.emit('connection');
eventEmitter.removeListener('connection',listener1);
console.log('listener1 监听取消')
//触发连续事件
eventEmitter.emit('connection');
eventListeners = eventEmitter.listenerCount('connection');
console.log(eventListeners+'个监听器监听连接事件');
console.log('程序执行完毕');
①首先添加2个方法 listener1 和 listener2
②然后监听方法 connection,执行的时候,回调listener1
③var eventListeners = eventEmitter.listenerCount('connection');
获取监听事件个数并且在下面打印出来
④使用emit触发 connection 事件
⑤让listener1 方法取消对 connection 的监听
⑥再次触发 connection
⑦重新统计 监听个数并且打印结果