EventEmitter类中使用Map存储事件和回调,回调函数存放在Set中防止重复添加
class EventEmitter {
constructor() {
this.cache = new Map()
}
on(eventname, fn) {
if (this.cache.has(eventname)) {
this.cache.get(eventname).add(fn)
} else {
this.cache.set(eventname, new Set([fn]))
}
}
off(eventname, fn) {
this.cache.get(eventname).delete(fn)
}
emit(eventname, once = false, ...args) {
this.cache.get(eventname).forEach(element => {
element(...args)
});
if (once) {
this.cache.delete(eventname)
}
}
once(eventname, fn) {
let wrapfn = (...args) => {
fn.apply(this, args)
this.off(eventname, wrapfn)
}
this.on(eventname, wrapfn)
}
}
let eventbus = new EventEmitter()
function fn1(name, age) {
console.log(`我是${name},我今年${age}岁了`)
}
function fn2(name) {
console.log(`我是${name}`)
}
// eventbus.on("shuchu", fn1)
eventbus.once("shuchu", fn2)
eventbus.emit("shuchu", false, "ysk", 21)
eventbus.emit("shuchu", false, "ysk", 21)
// eventbus.off("shuchu", fn1)
// eventbus.emit("shuchu", true, "ysk", 21)
// eventbus.emit("shuchu", true, "ysk", 21)