createSM
createSM方法用于创建一个单例仓库。仓库内可以注册多个 getter 函数(同步或异步),并提供缓存、请求去重、刷新等能力。返回的 Proxy 支持通过属性访问直接获取同步值。
语法
javascript
createSM(option)参数
optionObject
键值对形式的 getter 配置对象。 键为字符串,作为单例名称。 值为函数,可以是同步函数 Function 或异步函数 AsyncFunction,返回对应数据。
返回值
Proxy<SingletonManage> 返回一个 Proxy 包装的 SingletonManage 实例。访问代理上已存在的实例属性或方法(如 get、getSync、set、refresh)时直接返回;访问其他属性时,会通过 getSync 同步获取缓存值。
描述
createSM 内部基于 SingletonManage 类,并使用 Proxy 拦截属性访问。其核心能力:
- get(name)(异步):异步获取数据。
- 若内存中已有缓存则直接返回。
- 若已有进行中的请求,则等待该请求完成后返回结果(请求去重)。
- 否则调用
option[name]()发起请求,缓存结果并返回。
- getSync(name)(同步):同步获取数据。
- 若内存中已有缓存则直接返回。
- 否则同步调用
option[name]()并缓存返回。
- set(name, func)(异步):动态注册或更新 getter。
- 若
func为同步函数,仅注册到option中,不立即执行。 - 若
func为异步函数,立即执行并缓存结果(同样支持请求去重)。
- 若
- refresh(name)(异步):清除指定名称的缓存,并重新调用
get获取。
Proxy 的 get 拦截规则:若访问的属性在实例上已存在(如 get、set 等方法或 data 字段),直接返回实例属性;否则调用 getSync(key) 同步获取缓存值。
注意事项
- 依赖 ramda 库:内部使用
isNil来自 ramda,使用前需确保项目中已安装ramda。 - 由于使用 Proxy 对象,不支持 IE 浏览器。
get方法对异步 getter 才有意义,对同步 getter 也能工作(直接缓存同步结果)。getSync调用异步 getter 时只能拿到 Promise 对象,不能真正同步等到异步结果,所以异步 getter 应配合get使用。set方法对异步函数会立即执行并缓存;对同步函数仅注册不执行,需通过get/getSync触发。refresh仅清除内存缓存,不清除已注册的option中的 getter。- 实例的
option、data、promiseInstance为内部字段,不建议外部直接修改。
示例
基础用法
异步 getter 与请求去重
动态 set 与 refresh
浏览器兼容
由于使用 Proxy 对象,不支持 IE 浏览器,详细浏览器兼容性参考MDN Proxy 浏览器兼容性
性能考虑
get内部使用promiseInstance做请求去重,避免并发场景下重复请求,时间复杂度 O(1)。getSync命中缓存时直接返回,无额外开销;未命中时同步调用 getter,复杂度取决于 getter 自身。- 由于使用 Proxy,每次属性访问存在轻微拦截开销,但对单次操作可忽略。
- 缓存常驻内存,长期运行需注意单例仓库中数据量,必要时通过
refresh或手动清理。
相关函数
- RW - 高级读写领域代理
- Chain - 链式操作代理
- lazyChange - 惰性赋值代理
- waitValue - 等待条件成立