| 12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- /**
- * 简易事件总线(与全局 uni.$emit 隔离,避免命名冲突)
- */
- export default class EventEmitter {
- constructor() {
- this._listeners = {}
- }
- on(event, handler) {
- if (typeof handler !== 'function') return () => {}
- if (!this._listeners[event]) this._listeners[event] = []
- this._listeners[event].push(handler)
- return () => this.off(event, handler)
- }
- once(event, handler) {
- const wrapper = (...args) => {
- this.off(event, wrapper)
- handler(...args)
- }
- return this.on(event, wrapper)
- }
- off(event, handler) {
- if (!this._listeners[event]) return
- if (!handler) {
- delete this._listeners[event]
- return
- }
- this._listeners[event] = this._listeners[event].filter(fn => fn !== handler)
- }
- emit(event, ...args) {
- const list = this._listeners[event]
- if (!list || !list.length) return
- // 复制一份,避免回调中修改监听器
- list.slice().forEach(fn => {
- try { fn(...args) } catch (e) { console.error(`[EventEmitter] ${event}`, e) }
- })
- }
- clear() { this._listeners = {} }
- }
|