SEC_Warehouse/utils/ble/core/eventBus.js

65 lines
1.2 KiB
JavaScript

/**
* 轻量事件总线:用于 BLE Core 与业务模块之间的事件解耦。
*/
export function createEventBus() {
const listeners = {}
function on(eventName, handler) {
if (!listeners[eventName]) {
listeners[eventName] = new Set()
}
listeners[eventName].add(handler)
// 返回取消订阅函数,方便调用方在页面卸载时回收监听。
return () => {
off(eventName, handler)
}
}
function once(eventName, handler) {
const unsubscribe = on(eventName, (payload) => {
unsubscribe()
handler(payload)
})
return unsubscribe
}
function off(eventName, handler) {
if (!listeners[eventName]) {
return
}
listeners[eventName].delete(handler)
}
function emit(eventName, payload) {
if (!listeners[eventName]) {
return
}
listeners[eventName].forEach((handler) => {
try {
handler(payload)
} catch (error) {
console.error('[BLE event handler error]', eventName, error)
}
})
}
function clear() {
Object.keys(listeners).forEach((eventName) => {
listeners[eventName].clear()
})
}
return {
on,
once,
off,
emit,
clear
}
}