node核心EventEmitter的应用总结

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后,使用继承后的类。

 

 

 

Guess you like

Origin blog.csdn.net/qdmoment/article/details/105195840