node采用了事件驱动机制,而eventEmitter就是node事件驱动的基础,node所有的模块都继承了EventEmitter 类,拥有了自己的事件,可以绑定和触发监听函数,EventEmitter的实现就是利用了观察者模式,这也是实现事件驱动的基本模式
观察者模式
作用
观察者模式是一种设计模式,可以实现对象之间的解耦,实现了表示层和数据逻辑层的分离,并定义了稳定的更新消息传递机制, 当一个对象的变化需要通知其他多个对象而且这些对象之间需要松散耦合时就可以使用它。
实现
被观察者(主体)维护着一组其他对象派来(注册)的观察者,有新的对象对主体感兴趣就注册观察者,不感兴趣就取消订阅,主体有更新的话就依次通知观察者们
function Subject (){
this.listeners = {}
}
Subject.prototype = {
addListener: function (eventname, callback) {
if (typeof callback !== 'function'){
throw new TypeError('"listener" argument must be a function')
}
if(this.listeners[eventname] === 'undefined'){
this.listeners[eventname] = []
}
this.listeners[eventname].push(callback)
},
removeListener: function (eventname){
if(typeof callback !== 'function'){
throw new TypeError('"listener" argument must be a function')
}
if(Array.isArray(this.listeners[eventname]) && this.listeners[eventname].length !== 0) {
var callbackList = this.listeners[eventName]
for (var i = 0, len=callbackList.length; i < len; i++) {
if(callbackList[i] === callback) {
this.listeners[eventName].splice(i,1)
}
}
}
},
triggerEvent: function(eventName,...args) {
if(this.listeners[eventName]) {
for(var i=0, len=this.listeners[eventName].length; i<len; i++){
this.listeners[eventName][i](...args)
}
}
}
}
var event = new Subject()
function hello() {
console.log('hello, there')
}
event.addListener('hello', hello)
event.triggerEvent('hello') // 输出 hello, there
event.removeListener('hello', hello) // 取消监听
setTimeout(() => event.triggerEvent('hello'),1000) // 过了一秒什么也没输出
node中eventEmitter使用
(1)EventEmitter最基本的使用方法
EventEmitter是对事件触发和事件监听功能的封装,在node.js中的event模块中,event模块只有一个对象就是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','arg1 参数', 'arg2 参数');
}, 1000);
首先实例化了一个EventEimitter对象,然后通过on方法对特定的事件进行监听,通过emit方法对事件进行发布。
(2)EventEmitter支持的方法
EventEmitter实例对象支持的方法列表如下:
emitter.on(name, f) //对事件name指定监听函数f
emitter.once(name, f) //与on方法类似,但是监听函数f是一次性的,使用后自动移除
emitter.listeners(name) //返回一个数组,成员是事件name所有监听函数
emitter.removeListener(name, f) //移除事件name的监听函数f
emitter.removeAllListeners(name) //移除事件name的所有监听函数
异步编程四大范式
1.回调函数
2.发布订阅模式
3.promise
4.async
网友评论