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