1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
class Bus { constructor() {
this.eventListeners = new Map() }
registerEventListener(eventName, callback, once = false) { if (!this.eventListeners.has(eventName)) { this.eventListeners.set(eventName, []) }
const eventListeners = this.eventListeners.get(eventName) eventListeners.push({ callback, once }) }
$on(eventName, callback) { this.registerEventListener(eventName, callback) }
$once(eventName, callback) { const once = true this.registerEventListener(eventName, callback, once) }
$off(eventNameOrNames, callback = undefined) { const eventNames = Array.isArray(eventNameOrNames) ? eventNameOrNames : [eventNameOrNames]
for (const eventName of eventNames) { const eventListeners = this.eventListeners.get(eventName)
if (eventListeners === undefined) { continue }
if (typeof callback === 'function') { for (let i = eventListeners.length - 1; i >= 0; i--) { if (eventListeners[i].callback === callback) { eventListeners.splice(i, 1) } } } else { this.eventListeners.delete(eventName) } } }
$emit(eventName, ...args) { if (!this.eventListeners.has(eventName)) { return }
const eventListeners = this.eventListeners.get(eventName) const eventListenerIndexesToDelete = [] for (const [eventListenerIndex, eventListener] of eventListeners.entries()) { eventListener.callback(...args)
if (eventListener.once) { eventListenerIndexesToDelete.push(eventListenerIndex) } }
for (let i = eventListenerIndexesToDelete.length - 1; i >= 0; i--) { eventListeners.splice(eventListenerIndexesToDelete[i], 1) } } }
const EventBus = new Bus()
export default EventBus
|