Open mhahaha opened 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]; } } }
once 绑定执行一次的事件有多种思路,例如可以执行过后将绑定的方法置空,执行时提示已执行。要么在数据结构设置这里下手,初始化绑定的时候加一个 once 标识,执行后置为 true,再次执行对该标识先进行判断。
let eventMap = { fnName: { once: false, callback: fn } }