Files
2026-09-03 11:35:21 +08:00

95 lines
1.9 KiB
JavaScript

// utils/store.js
// 轻量全局缓存(内存级,冷启动自然为空)
// - cacheProfile / getProfile / removeProfile:健康档案缓存(id → 原始文档)
// - notifyProfileChange:档案变更通知,列表页订阅后刷新
// 注意:拉取列表回填缓存时务必用 cacheProfile(静默),
// 只有真实的增删改才走 notifyProfileChange,避免"回填→通知→再拉取"死循环
const cache = {}
const listeners = {}
/**
* 订阅事件,返回取消订阅函数
*/
function on(event, cb) {
if (!listeners[event]) listeners[event] = []
listeners[event].push(cb)
return () => off(event, cb)
}
/**
* 取消订阅
*/
function off(event, cb) {
const list = listeners[event]
if (!list) return
const idx = list.indexOf(cb)
if (idx > -1) list.splice(idx, 1)
}
function emit(event, data) {
;(listeners[event] || []).slice().forEach(cb => {
try {
cb(data)
} catch (err) {
console.error(`[store] ${event} 订阅回调异常`, err)
}
})
}
// ---- 通用键值 ----
function get(key) {
return cache[key]
}
function set(key, value) {
cache[key] = value
}
function remove(key) {
delete cache[key]
}
// ---- 健康档案缓存 ----
/**
* 静默回填缓存(不触发变更通知)
*/
function cacheProfile(profile) {
if (profile && profile._id) {
cache[`profile:${profile._id}`] = profile
}
}
function getProfile(id) {
return id ? cache[`profile:${id}`] : null
}
/**
* 删除缓存
*/
function removeProfile(id) {
if (id) delete cache[`profile:${id}`]
}
/**
* 档案变更通知(增删改成功后调用)
* @param {string} action - 'create' | 'update' | 'remove'
* @param {string} id - 档案ID
*/
function notifyProfileChange(action, id) {
emit('profile-change', { action, id })
}
module.exports = {
on,
off,
get,
set,
remove,
cacheProfile,
getProfile,
removeProfile,
notifyProfileChange
}