70 lines
1.5 KiB
JavaScript
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
|
|
}
|
|
}
|