发布订阅模式,定义对象间的一种一对多
的依赖关系,一个发布者可以对应多个订阅者,当发布者发生变化
的时候,他可以将消息一一通知给所有的订阅者,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
。
node中很多模块都继承自events
var EventEmmiter = require('events');
可以通过on方法和addListener方法绑定事件
on(event,listener);
addListener(event,listener);
var EventEmmiter = require('events');
var util = require('util');
function Girl() {}
util.inherits(Girl,EventEmmiter);
var girl = new Girl();
girl.on('帅哥来了',function () {
console.log('喜欢帅哥');
});
emit(event,args);
girl.emit('帅哥来了');
绑定一次,多次触发只执行一次
once(event,listener);
var come = function () {
console.log('送个飞吻');
};
girl.once('帅哥来了',come);
girl.emit('帅哥来了');
girl.emit('帅哥来了');
girl.removeListener(event,listener);
girl.on('帅哥来了',come);
girl.removeListener('帅哥来了',come);
girl.emit('帅哥来了');
通过事件名,移除事件绑定,可以通过不加参数的方式移除所有监听
removeAllListeners(event);
girl.removeAllListeners('帅哥来了');
girl.removeAllListeners();
默认最大监听数为10,超过最大监听数会产生警告
setMaxListeners(count);
在监听之前设置最大监听数
setMaxListeners(3);
girl.listeners(event);
girl.listeners('帅哥来了');
girl.listenerCount(event);
girl.listenerCount('帅哥来了');
Observable.prototype.on = Observable.prototype.addListener = function (event, listener) {
if (this._events[event]) {
this._events[event].push(listener);
} else {
this._events[event] = [listener];
}
if(this._events[event].length>this._maxListeners){
console.error('maxListener reached!');
}
}
Observable.prototype.emit = function(event){
var args = Array.prototype.slice.call(arguments,1);
if(this._events[event]){
var listeners = this._events[event];
listeners.forEach(function(listener){
listener.apply(null,args);
});
}
}