事件发布订阅系统

创建

const event = new Events()

方法
  • 订阅事件on('eventName', fn,[...args])
  • 触发事件fire('eventName',[...fireArgs])
  • 取消订阅off('eventName',fn)
  • 订阅事件(一次性)once('eventName', fn,[...args])
代码
class Events {
    constructor(){
        this.events = {}
    }
    on(eventName,fn,...args){
        if(!this.events[eventName]){
            this.events[eventName] = []
        }
        this.events[eventName].push({
            fn,
            args
        })
    }
    fire(eventName,...fireArgs){
        var sss = fireArgs
        if(!this.events[eventName]) return
        this.events[eventName].forEach((item,idx,arr) => {
            item.fn.call(null,...item.args,...sss)
            if(item.once){
                arr.splice(idx,1)
            }
        })
    }
    off(eventName,fn){
        if(!this.events[eventName]) return
        const idx = this.events[eventName].findIndex((item) => item.fn == fn)
        this.events[eventName].splice(idx,1)
    }
    once(eventName,fn,...args){
        if(!this.events[eventName]){
            this.events[eventName] = []
        }
        this.events[eventName].push({
            fn,
            args,
            once: true
        })
    }
}
测试
	var obj ={
	    aaa:'asdasd',
	    fn1: function(... args){
	        console.log('event111', ... args, this.aaa)
	    },
	    fn2: (...args) => console.log('event222', ... args, this.aaa)
	}
	var fn3 = (... args) => console.log('event333', ... args)
	var event = new Events();
	event.on('eventname', obj.fn1.bind(obj), 1, 2, 3);
	// event111 1 2 3 4 5 6 asdasd
	event.on('eventname', obj.fn2.bind(obj), 1, 2, 3);
	// 箭头函数this不能绑定
	// event222 1 2 3 4 5 6 undefined
	event.on('eventname', fn3, 1, 2, 3);
	// event222 1 2 3 4 5 6
	event.fire('eventname', 4, 5, 6);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值