// 存储一个事件回调数组 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]; } }, };