feat: 优化MyEvent
This commit is contained in:
@@ -1,15 +1,37 @@
|
|||||||
class MyEvent {
|
class MyEvent {
|
||||||
static list = []
|
constructor() {
|
||||||
add(name, call) {
|
// 使用 Object 或 Map 存储,实现 O(1) 级别的查找
|
||||||
MyEvent.list.push({ name, call })
|
this.events = new Map()
|
||||||
}
|
}
|
||||||
remove(name, call) {
|
add(name, call) {
|
||||||
MyEvent.list = MyEvent.list.filter(item => item.name != name && item.call != call)
|
if (!this.events.has(name)) {
|
||||||
}
|
this.events.set(name, [])
|
||||||
emit(name, data) {
|
}
|
||||||
MyEvent.list.forEach(item => {
|
this.events.get(name).push(call)
|
||||||
if (item.name == name) item.call(data)
|
}
|
||||||
})
|
remove(name, call) {
|
||||||
}
|
if (!this.events.has(name)) return
|
||||||
|
|
||||||
|
if (!call) {
|
||||||
|
this.events.delete(name)
|
||||||
|
} else {
|
||||||
|
const callbacks = this.events.get(name)
|
||||||
|
const index = callbacks.indexOf(call)
|
||||||
|
if (index !== -1) {
|
||||||
|
callbacks.splice(index, 1)
|
||||||
|
}
|
||||||
|
// 如果该事件没有监听者了,彻底清理 key
|
||||||
|
if (callbacks.length === 0) {
|
||||||
|
this.events.delete(name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
emit(name, data) {
|
||||||
|
const callbacks = this.events.get(name)
|
||||||
|
if (callbacks) {
|
||||||
|
// 使用 slice() 镜像一份副本,防止在执行回调过程中有 remove 操作导致索引错乱
|
||||||
|
callbacks.slice().forEach((cb) => cb(data))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
export default new MyEvent()
|
export default new MyEvent()
|
||||||
|
|||||||
Reference in New Issue
Block a user