EventEmitter是node中应用非常广泛,不管是框架,还是脚手架,还是插件都可以看到eventEmitter的身影。比如我们去查看vue, react, webpack, egg, koa等框架或者插件的源码,都可以看到内部使用到了EventEmitter。那么到底什么是EventEmitter呢。
总体介绍:
进入node.js官网,eventEmitter的介绍有一大堆api,很多初学者觉得一头雾水,其实eventEmitter并不复杂,它采用了js中最经典的设计模式,订阅/发布者模式,在此基础上扩展和封装实现了适用于node中的方法和事件。
做个比喻,eventEmitter就像一个信号调度中心,这个调度中心存储了所有内部事件的信号,并接收外界的信号,当接收到外界的信号时,根据信号去触发对应的事件。再简单一些可以理解为手机号码存储中心,先把所有号码的信息存储到这个中心,当拨打号码时,通知到对应的人。
下面是eventEmitter一个简单的实现
events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。
EventEmitter是一个类,使用时需要实例化
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);
常用api:
方法
订阅事件on(event, listener),addListener(event, listener) (添加电话号码)
单次订阅once(event, listener) (只用一次的电话号码)
移除订阅事件 removeListener(event, listener) listener必须传入(删除某个电话号码)
移除所有 removeAllListeners([event]) (删除所有电话号码)
var callback = function(stream) {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
设置事件订阅的个数:setMaxListeners(n) (最多有多少个电话号码)
返回事件订阅的个数:listeners(event) (电话号码的个数)
按顺序触发事件订阅的函数:emit(event, [arg1], [arg2], [...]) (打电话)
事件event
添加新监听器时被触发,newListener 事件会触发,
当监听器被移除时,removeListener 事件被触发
这里的removeListener和newListener指的是事件,虽然removeListener和方法removeListener名字一样,但是一个是事件,一个是方法。
实例:
除了上面的添加事件和移除事件,还有error事件
error 事件
error事件在node运行发生错误时被触发,但是当 error 被触发时,EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常,退出程序并输出错误信息。
所以一般我们要给emitter添加错误事件监听
以上就是events模块EventEmitter的使用,不过很多情况下,我们会继承EventEmitter后,使用继承后的类。