手写发布订阅代码

class EventEmitter {
	constructor() {
		this.events = {}
	}
	//实现(注册)订阅
	on(type, callBack) {
		!this.events[type]?this.events[type] = [callBack]:this.events[type].push(callBack)
	}
	//删除订阅
	off(type, callBack){
		if(!this.events[type]) return;
		this.events[type] = this.events[type],filter(item=>{
			return item !== callBack;
		})
	}
	//只执行一次订阅事件(订阅完成,触发一次后,立即执行删除订阅)
	once(type,callBack){
		function fn(){
			callBack();
			this.off(type,fn)
		}
		this.on(type,fn)
	}
	//触发事件
	emit(type,...rest){
		this.events[type] && this.events[type].forEach((fn)=>{
			fn.apply(this,rest)
		})
	}
}

//使用方法:
const event = new EventEmitter();

const handle = (...rest) => {
   console.log(rest);
};
//如果不订阅,直接触发
event.emit("click", 1, 2, 3, 4);  // undefined
//先订阅,后出发
event.on("click", handle);
event.emit("click", 1, 2, 3, 4);  //[1,2,3,4]
//删除订阅,再触发
event.off("click", handle);
event.emit("click", 1, 2); // undefined
//只订阅一次
event.once('myClick', ()=>{
    console.log(11111)
})
event.emit("myClick"); // 11111
event.emit("myClick"); // undefined
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值