发布与订阅代码实现

发布与订阅代码实现

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');
上一篇:BackgroundWorker类的案例


下一篇:HDLBits刷题_Verilog Language_Vector3