写在前面
事件的编程方式具有轻量级、松耦合、只关注事务点等优势,在浏览器端,有着自己的一套DOM
事件机制,其中含包括这诸如事件冒泡,事件捕获等;然而Node
的事件机制没有事件冒泡等,其原理就是设计模式中的观察者模式。Node
很多的模块继承这个事件模块,下面我们就来根据源码来学习下其API
,做到知其然更知其所以然。
引入模块
const EventEmitter = require("events");
const EventEmitter = require("events").EventEmitter;
经常会看到这种两种方式来引入我们的events
模块,但是在Node
的高版本中可以直接使用第一种方式,高版本也支持下面这种方式,下面的这种方式主是在Node
的0.10.x
版本时使用,源码中也是很清楚,之所以这么做就是为了兼容低版本时写下的Node
代码:
module.exports = EventEmitter;
EventEmitter.EventEmitter = EventEmitter;
注:之后提到的obj
为EventEmitter
的实例对象,也就是obj = new EventEmitter()
基本使用
得到我们的事件构造函数后,我们就可以来实例化一个事件对象:
const EventEmitter = require("events"),
follow = new EventEmitter();
follow.on("node", question => {
console.log(`有一个关于node的问题: ${question}`);
});
follow.emit("node", "jade与ejs选择哪个?");
这是一个简单的使用,下面我们就来看看我们所用到的API
以及它们的实现:
订阅事件
on(type, listener)
来订阅事件,传入的type
参数为事件名,listener
为待发布函数。同时addListener
方法和on
方法有着同样的效果,指向的是内存的同一块:
EventEmitter.prototype.on = EventEmitter.prototype.addListener