SEC_Warehouse/utils/ble/core/eventBus.js

70 lines
1.5 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)
}
/** 广播事件,所有监听器同步执行(内部已 try-catch 隔离)。 */
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
}
}