ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

发布与订阅代码实现

2022-02-06 13:31:59  阅读:133  来源: 互联网

标签:function 订阅 绑定 handle 代码 cache 发布 let type


发布与订阅代码实现

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');

标签:function,订阅,绑定,handle,代码,cache,发布,let,type
来源: https://www.cnblogs.com/huangwenchao0821/p/15865561.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有