Event Bus简单实现
class EventBus {
constructor() {
this.list = new Map();
}
on(event, fn) {
if (this.list.has(event)) {
this.list.set(event, [...this.list.get(event), fn]);
} else {
this.list.set(event, [fn]);
}
}
off(event, fn) {
if (!arguments.length) {
this.list.clear();
}
if (arguments.length === 1) {
this.list.delete(event);
}
if (this.list.has(event) && fn) {
let fns = this.list.get(event);
for (let i = 0; i < fns.length; i++) {
if (fns[i] === fn || fns[i].fn === fn) {
fns.splice(i, 1);
}
}
this.list.set(event, [...fns]);
}
}
once(event, fn) {
let self = this;
function handler() {
self.off(event, handler);
fn.apply(null, arguments);
}
handler.fn = fn;
this.on(event, handler);
}
emit(event, ...args) {
if (this.list.has(event)) {
for (let fn of this.list.get(event)) {
fn.apply(null, args);
}
}
}
}
let obj = new EventBus();