mhahaha / js-snippets

Daily JS Snippets
0 stars 0 forks source link

手写 EventBus #7

Open mhahaha opened 2 years ago

mhahaha commented 2 years ago
class EventBus {
    constructor (initialEventMap = {}) {
        this.eventMap = {};

        // 初始化进行批量事件绑定, 同时做事件异常检测
        Object.entries(initialEventMap).forEach(([name, fn]) => {
            this.on(name, fn);
        });

    }

    /**
     * 事件绑定
     * @param { String } name 事件名称
     * @param { Function } fn 事件回调
     */
    on (name, fn) {
        if (this.eventMap[name]) {
            throw new Error(`已存在名为${name}的事件注册!`);
        }

        if (typeof fn !== 'function') {
            throw new Error(`${name} 不是一个有效Function!`);
        }

        this.eventMap[name] = fn;
    }

    /**
     * 事件触发
     * @param { String } name 事件名称
     * @param { Function } fn 事件参数
     */
    emit (name, ...rest) {
        if (!this.eventMap[name]) {
            throw new Error(`请先注册事件${name}!`);
        }

        this.eventMap[name](...rest);
    }

    /**
     * 事件解绑
     * @param { String } name 事件名称
     */
    off (name) {
        if (this.eventMap[name]) {
            delete this.eventMap[name];
        }
    }
}
mhahaha commented 2 years ago

once 绑定执行一次的事件有多种思路,例如可以执行过后将绑定的方法置空,执行时提示已执行。要么在数据结构设置这里下手,初始化绑定的时候加一个 once 标识,执行后置为 true,再次执行对该标识先进行判断。

let eventMap = {
    fnName: {
        once: false,
        callback: fn
    }
}