class EventEmiter { constructor() { this.cache = [] } on(name, fn) { const tasks = this.cache[name] if (tasks) { tasks.push(fn) } else { this.cache[name] = [fn] } } off(name, fn) { if (!name) { this.cache = [] return } const tasks = this.cache[name] if (tasks) { if (!fn) { this.cache[name] = [] } const index = tasks.findIndex(item => item === fn) if (index >= 0) { tasks.splice(index, 1) } } } emit(name, ...args) { // 复制一份,防止回调里继续 on 导致死循环 const tasks = this.cache[name].slice() if (tasks) { for (let task of tasks) { task(...args) } } } once(name, cb) { const fn = (...args) => { cb(...args) this.off(name, fn) } this.on(name, fn) } }解释一下
时间: 2024-02-10 22:33:07 浏览: 49
js event emitter
这段代码实现了一个事件管理器类 EventEmiter,可以通过 on 方法订阅事件、通过 off 方法取消订阅事件、通过 emit 方法触发事件、以及通过 once 方法订阅一次性事件。
具体来说,EventEmiter 类有一个缓存对象 cache,用于存储不同事件对应的回调函数列表。on 方法用于订阅事件,它接受两个参数,name 表示事件名,fn 表示回调函数。当订阅一个已经存在的事件时,它会将回调函数添加到对应的回调函数列表中,否则会新建一个回调函数列表。off 方法用于取消订阅事件,它接受两个参数,name 表示事件名,fn 表示回调函数。当不传入任何参数时,它会清空所有事件的回调函数列表。当传入事件名时,它会删除该事件对应的回调函数列表,当传入事件名和回调函数时,它会删除该事件的对应的回调函数。emit 方法用于触发事件,它接受一个事件名和一些参数。它会从对应的回调函数列表中依次调用回调函数,并传入参数。once 方法用于订阅一次性事件,它接受两个参数,name 表示事件名,cb 表示回调函数。它会先定义一个新的回调函数 fn,它会在调用 cb 回调函数之后自动取消订阅该事件。然后调用 on 方法订阅事件,传入新的回调函数 fn。
阅读全文