class EventEmit {
constructor() {
// 存储事件名和回调
this.listen = new Map()
}
// 注册事件,添加回调
on(name, callback) {
const listen = this.listen
if (listen.has(name)) {
// 已存在事件,直接尾部添加回调
const callbacks = listen.get(name)
listen.set(name, [...callbacks, callback])
} else {
// 不存在事件,新加回调数组,方便同一事件多次添加回调
listen.set(name, [callback])
}
}
// 触发事件,传递参数,参数个数未知,采用rest
emit(name, ...rest) {
const callbacks = this.listen.get(name)
// 有回调数组才执行
if (callbacks && callbacks.length) {
// 循环执行回调,并把所有参数传递给每个回调
callbacks.forEach(fn => {
fn(...rest)
});
}
}
// 移除指定事件的回调
remove(name, callback) {
const callbacks = this.listen.get(name)
if (callbacks && callbacks.length) {
// 使用数组筛选剔除要删除的回调
const newCallbacks = callbacks.filter(fn => {
return fn !== callback
});
this.listen.set(name, newCallbacks)
}
}
// 移除指定事件的全部回调
removeAll(name) {
this.listen.set(name, [])
}
// 注册事件,添加只执行一次的回调
once(name, callback) {
// 重新包装回调,执行之后,执行移除
const newCallback = (...rest) => {
callback(...rest)
this.remove(name, newCallback)
}
this.on(name, newCallback)
}
}
// 测试
const event = new EventEmit()
event.on('fn', (...rest) => {
console.log('rest')
console.log(...rest)
})
event.on('fn', (...rest) => {
console.log('rest2')
console.log(...rest)
})
event.once('fn', (...rest) => {
console.log('rest3')
console.log(...rest)
})
event.emit('fn', 1,2,3,4)
event.emit('fn', 1,2,3,4)
简版事件发布订阅
于 2023-03-15 21:00:00 首次发布