/** * 后台返回事件总线 * * 触发方:App.vue 在 onShow 中检测到"从后台切回前台"时调用 * emitAppReturnFromBackground() * 订阅方:页面通过 composables/useBackgroundRefresh.js 注册回调 * * 为什么不用 uni.$emit / uni.$on: * 1. 事件名是字符串,缺乏约束,容易和其他业务事件撞名 * 2. 集中在一处便于后续加日志、节流、灰度等横切逻辑 */ const listeners = new Set() /** * 注册后台返回监听 * @param {Function} fn 回调函数 * @returns {Function} 取消监听的函数 */ export function onAppReturnFromBackground(fn) { if (typeof fn !== 'function') return () => {} listeners.add(fn) return () => listeners.delete(fn) } /** * 触发后台返回事件,通知所有订阅者 */ export function emitAppReturnFromBackground() { listeners.forEach(fn => { try { fn() } catch (e) { // 单个监听者异常不影响其他监听者 console.error('[backgroundRefreshBus] listener error:', e) } }) } /** * 清空所有监听(仅用于测试或强制重置) */ export function clearAppReturnFromBackgroundListeners() { listeners.clear() }