JavaScrip实现发布订阅模式
手写发布订阅
实现思路:
-
需要有一个list对象缓存订阅事件 订阅(on)如果存在事件就往list里面缓存事件 取消订阅(off)从list对象找到订阅事件删除 发布(emit)从list对象找到事件去执行就OK 只发布一次(once)执行完删除即可
代码实现:
class EventEmitter { constructor(){ // 事件缓存列表 this.list = { } } // 订阅 on(name,fn){ // 如果存在事件 if(this.list[name]) { this.list[name].push(fn) } else { this.list[name] = [fn] } } // 取消订阅 off(name,fn){ // 找到已经注册的事件 let tasks = this.list[name] // 判断该事件是否注册 if(tasks){ const index = tasks.findIndex(f === fn || f.callback === fn) if(index>=0) { tasks.splice(index,1) } } } // 发布 emit(name,once=false,...args){ if(this.list[name]) { // 创建副本,如果回调函数内部继续注册相同的事件,会造成死循环 let tasks = this.list[name].slice() for(let fn of tasks) { fn(...args) } // 如果只发布订阅一次,执行完上面代码就把事件删除 if(once) { delete this.list[name] } } } } // 测试 let eventBus = new EventEmitter() let fn1 = function(name, age) { console.log(`${ name} ${ age}`) } let fn2 = function(name, age) { console.log(`hello, ${ name} ${ age}`) } eventBus.on(aaa, fn1) eventBus.on(aaa, fn2) eventBus.emit(aaa, false, 布兰, 12) Object.defineProperty
上一篇:
Java基础知识总结(2021版)
下一篇:
面试之springboot自动配置原理