19.实现事件订阅发布(eventBus) 实现EventBus类,有 on off once trigger功能,分别对应绑定事件监听器,解绑,执行一次后解除事件绑定,触发事件监听器。
查看答案
class EventBus { on (eventName, listener ) {} off (eventName, listener ) {} once (eventName, listener ) {} trigger (eventName ) {} } const e = new EventBus();e.on('e1' , fn1) e.once('e1' , fn2) e.trigger('e1' ) e.trigger('e1' ) e.off('e1' , fn1) e.trigger('e1' )
class EventBus { constructor ( ) { this .eventList = {} } $on(eventName, fn) { this .eventList[eventName] ? this .eventList[eventName].push(fn) : (this .eventList[eventName] = [fn]) } $emit(eventName) { if (!eventName) throw new Error ('请传入事件名' ) const data = [...arguments].slice(1 ) if (this .eventList[eventName]) { this .eventList[eventName].forEach((i ) => { try { i(...data) } catch (e) { console .error(e + 'eventName:' + eventName) } }) } } $once(eventName, fn) { const _this = this function onceHandle ( ) { fn.apply(null , arguments ) _this.$off(eventName, onceHandle) } this .$on(eventName, onceHandle) } $off(eventName, fn) { if (!arguments .length) { return (this .eventList = {}) } if (Array .isArray(eventName)) { return eventName.forEach((event ) => { this .$off(event, fn) }) } if (arguments .length === 1 || !fn) { this .eventList[eventName] = [] } this .eventList[eventName] = this .eventList[eventName].filter( (f ) => f !== fn ) } } const event = new EventBus()let b = function (v1, v2, v3 ) { console .log('b' , v1, v2, v3) } let a = function ( ) { console .log('a' ) } event.$once('test' , a) event.$on('test' , b) event.$emit('test' , 1 , 2 , 3 , 45 , 123 ) event.$off(['test' ], b) event.$emit('test' , 1 , 2 , 3 , 45 , 123 )