发布与订阅代码实现
1、实现思路
1、绑定自定义事件:
首先需要一个对象,用来保存绑定的方法,将需要执行的方法加入该对象中
2、触发自定义事件:
运行对象中指定的绑定对象
3、运行一次:
修改执行的方法,将其绑定为只要执行就解除绑定的方法
4、解绑方法:
从缓存对象中删除该类型的方法
2、代码实现
function Event() {
this.cache = {}
}
Event.prototype.on = function(type,handle) {
if(this.cache[type]) {
this.cache[type].push(handle)
} else{
this.cache[type] = [handle]
}
}
Event.prototype.emmit = function() {
//
let type = arguments[0]
let params = [].slice.call(arguments,1)
if(this.cache[type]) {
let len = this.cache[type].length
// 依次执行函数
for(let i=0;i<len;i++) {
this.cache[type][i].apply(this,params)
}
} else {
return
}
}
Event.prototype.empty = function(type) {
this.cache[type] = []
}
// 只运行一次
Event.prototype.once = function(type,handle) {
let that = this
function on() {
handle.apply(that,arguments)
that.off(type,on)
}
on.handle = handle
that.on(type,on)
}
// 关闭发布
Event.prototype.off = function(type,handle) {
if(this.cache[type]) {
// 没有传入handle值的话,我们将type列表中的handle全部清空
if(!handle) {
this.cache[type] = []
}
let len = this.cache[type].length
for(let i=0;i<len;i++) {
if(handle === this.cache[type][i]) {
this.cache[type].splice(i,1)
break;
}
}
}
}
// 测试
function deal1(time) {
console.log('overtime1 ' + time);
}
function deal2(time) {
console.log('overtime2 ' + time);
}
function deal3(time) {
console.log('overtime3 ' + time);
}
function deal4(time) {
console.log('overtime4 ' + time);
}
// 测试
var oE = new Event();
oE.on('over', deal1);
oE.on('over', deal2);
oE.on('over', deal3);
oE.once('over2', deal4);
oE.off('over', deal1);
oE.emmit('over', 'first-2020-9-6');
oE.emmit('over2', 'second-2020-9-7');
console.log('---------');
oE.emmit('over', 'first-2020-9-6');
oE.emmit('over2', 'second-2020-9-7');