feat: 优化MyEvent

This commit is contained in:
2026-04-02 14:51:00 +08:00
parent 04611c60d8
commit 6d6d575483

View File

@@ -1,15 +1,37 @@
class MyEvent { class MyEvent {
static list = [] constructor() {
// 使用 Object 或 Map 存储,实现 O(1) 级别的查找
this.events = new Map()
}
add(name, call) { add(name, call) {
MyEvent.list.push({ name, call }) if (!this.events.has(name)) {
this.events.set(name, [])
}
this.events.get(name).push(call)
} }
remove(name, call) { remove(name, call) {
MyEvent.list = MyEvent.list.filter(item => item.name != name && item.call != 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) { emit(name, data) {
MyEvent.list.forEach(item => { const callbacks = this.events.get(name)
if (item.name == name) item.call(data) if (callbacks) {
}) // 使用 slice() 镜像一份副本,防止在执行回调过程中有 remove 操作导致索引错乱
callbacks.slice().forEach((cb) => cb(data))
}
} }
} }
export default new MyEvent() export default new MyEvent()