手写发布订阅
const eventHub = {
map:{
// click: [f1,f2]
},
on: (name, fn) => {
eventHub.map[name] = event.map[name] || []
eventHub.map[name].push(fn)
},
emit: (name, data) => {
const q = eventHub.map[name] //alias缩写
if(!q) return // 为空就return
q.map(f => f.call(undefined, data)) // 遍历
return undefined
},
off: (name,fn) => {
const q = eventHub.map[name]
if(!q) {return}
const index = q.indexOf(fn)
if(index < 0) {return}
q.splice(index,1)
}
}
eventHub.on('click', console.log)
eventHub.on('click', console.error)
setTimeout(() => {
eventHub.on('click', '李智恩')
}, 3000)
// once 只监听一次 监听完之后自动取消掉 (这里省略)
用class实现
// 也可以用 class 实现
class EventHub {
map = {}
on(name, fn) {
this.map[name] = this.map[name] || []
this.map[name].push(fn)
}
emit(name, data) {
const fnList = this.map[name] || []
fnList.forEach(fn => fn.call(undefined, data))
}
off(name, fn) {
const fnList = this.map[name] || []
const index = fnList.indexOf(fn)
if(index < 0) {return}
fnList.splice(index,1)
}
}
// 使用
const e = new EventHub()
e.on('click', (name) => {
console.log('hi '+ name);
})
e.on('click', (name) => {
console.log('hello '+ name);
})
setTimeout(() => {
e.emit('click', '李智恩')
},3000)
版权声明:本文为weixin_57541715原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。