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,
};
}