EventEmitter.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. /**
  2. * 简易事件总线(与全局 uni.$emit 隔离,避免命名冲突)
  3. */
  4. export default class EventEmitter {
  5. constructor() {
  6. this._listeners = {}
  7. }
  8. on(event, handler) {
  9. if (typeof handler !== 'function') return () => {}
  10. if (!this._listeners[event]) this._listeners[event] = []
  11. this._listeners[event].push(handler)
  12. return () => this.off(event, handler)
  13. }
  14. once(event, handler) {
  15. const wrapper = (...args) => {
  16. this.off(event, wrapper)
  17. handler(...args)
  18. }
  19. return this.on(event, wrapper)
  20. }
  21. off(event, handler) {
  22. if (!this._listeners[event]) return
  23. if (!handler) {
  24. delete this._listeners[event]
  25. return
  26. }
  27. this._listeners[event] = this._listeners[event].filter(fn => fn !== handler)
  28. }
  29. emit(event, ...args) {
  30. const list = this._listeners[event]
  31. if (!list || !list.length) return
  32. // 复制一份,避免回调中修改监听器
  33. list.slice().forEach(fn => {
  34. try { fn(...args) } catch (e) { console.error(`[EventEmitter] ${event}`, e) }
  35. })
  36. }
  37. clear() { this._listeners = {} }
  38. }