Files

73 lines
1.8 KiB
TypeScript
Raw Permalink Normal View History

2025-11-28 16:49:36 +08:00
// 存储一个事件回调数组
const listeners: { [key: string]: any[] } = {};
// 触发事件的函数
function triggerEvent(key: string, data: any) {
if (listeners[key]) {
listeners[key].forEach((callback: any) => {
callback(data);
});
}
// 也可以触发一个通用的 'change' 事件
if (listeners["change"]) {
listeners["change"].forEach((callback: any) => {
callback({ key, data });
});
}
}
type IFun = Function & { $$functionKey?: string };
export const Subscribe = {
/**
*
* @param key key
* @param value
*/
set(key: string, value: any) {
// 1. 执行原有的存储操作
// setStorage(key, value);
// 2. 触发自定义事件,通知订阅者
triggerEvent(key, value);
},
// get(key: string) {
// return getStorage(key);
// },
remove(key: string) {
triggerEvent(key, null); // 或者触发一个 'remove' 事件
},
/**
*
* @param key key
* @param functionKey key()
* @param callback
*/
on(key: string, functionKey: string, callback: () => void) {
if (!listeners[key]) {
listeners[key] = [];
}
if (typeof callback == "function") {
(callback as IFun)["$$functionKey"] = functionKey;
listeners[key].push(callback);
} else {
console.log("订阅事件 callback 必须是函数");
}
},
/**
*
* @param key key
* @param functionKey key()
*/
off(key: string, functionKey: string) {
if (!listeners[key]) return;
listeners[key] = listeners[key].filter((cb: IFun) => cb.$$functionKey != functionKey);
if (listeners[key].length == 0) {
delete listeners[key];
}
},
};