事件驱动,顾名思义就是用事件运行代码。如在前端,我定义了一个Btn按钮,给他绑定了一个事件,如果一百年以内没有人点过这个按钮那么他的事件就不会被触发,他的内部程序就不会运行,所以这个理念用到node.js也是ok的。但是node没有html那种定义事件的btn怎么办??
于是就有了events这个模块,他的主要功能就是绑定事件。
在node.js中有一个events模块,是事件驱动型,类似于我前端建立了一个btn事件,然后再规定的时间触发了这个btn事件
如何去用Events模块来写。
var events = require('events'); //先引用
var ObServer = new events.EventEmitter();
ObServer.on('MyBtnName', function (res) {
console.log(res) //第一个参数MyBtnName就是你绑定得名字可以说是一个key值
//function得res应该不用解释了把,这个是回调,也就是你触发时候传入得参数
})
//触发这个事件
ObServer.emit('MyBtnName','我是测试');
//第一个参数则是你绑定得事件,后面传入得参数在MyBtnName得回调里面可以获取
以上是官网模块得基本调用方法,接下来我们可以写一个简单得,监听方法和触发方法
class EventsGyc {
constructor(){
this._events = this._events ||new Map //Map是Map对象
this.maxlength = this.maxlength || 10 //这个不出意外应该是最大能监听10或者自己设置
}
}
先定义一个类,EventsGyc等同于events类
//这个时候在其原型上添加方法
EventsGyc.prototype.emit = function(name,...args){
let data = this._events.get(name);
if(args.length>0){
data.apply(this,args) //回调
}else {
data.call(this) //回调
}
return true;
}
这个是触发方法,其核心主要得是在这个回调,这个回调很灵性
EventsGyc.prototype.on = function(name,fn){
if(!this._events.get(name)){ //name属于key值
this._events.set(name,fn);
}
}
//监听事件,做要是把name当作key,fn参数当成数据,存放在Map集合中。
这个时候监听和绑定事件都写好,我们可以写写例子试试跑跑
let EventGyc = new EventsGyc(); //观察者模式其实,就是在函数得原型链上进行保存。
EventGyc.on('gyc',function (res,res1,res2,rew3) { //创建一个gyc事件
console.log(res)
console.log(res1,res2,rew3)
})
EventGyc.emit('gyc','2222','2331','4444','1111'); // 触发gyc事件并且传入四个参数
事件驱动得原理大概清楚了一些,写下来分享个人得拙见,在我得理解里面,事件驱动就是在事件得原型上进行操作,把name和参数当作数据保存在原型得map集合中,每当被触发得时候则就需取出参数当作回调传回给on函数