Skip to content

createSM

createSM方法用于创建一个单例仓库。仓库内可以注册多个 getter 函数(同步或异步),并提供缓存、请求去重、刷新等能力。返回的 Proxy 支持通过属性访问直接获取同步值。

语法

javascript
createSM(option)

参数

  • option Object

  键值对形式的 getter 配置对象。   键为字符串,作为单例名称。   值为函数,可以是同步函数 Function 或异步函数 AsyncFunction,返回对应数据。

返回值

Proxy<SingletonManage>

  返回一个 Proxy 包装的 SingletonManage 实例。访问代理上已存在的实例属性或方法(如 getgetSyncsetrefresh)时直接返回;访问其他属性时,会通过 getSync 同步获取缓存值。

描述

createSM 内部基于 SingletonManage 类,并使用 Proxy 拦截属性访问。其核心能力:

  • get(name)(异步):异步获取数据。
    • 若内存中已有缓存则直接返回。
    • 若已有进行中的请求,则等待该请求完成后返回结果(请求去重)。
    • 否则调用 option[name]() 发起请求,缓存结果并返回。
  • getSync(name)(同步):同步获取数据。
    • 若内存中已有缓存则直接返回。
    • 否则同步调用 option[name]() 并缓存返回。
  • set(name, func)(异步):动态注册或更新 getter。
    • func 为同步函数,仅注册到 option 中,不立即执行。
    • func 为异步函数,立即执行并缓存结果(同样支持请求去重)。
  • refresh(name)(异步):清除指定名称的缓存,并重新调用 get 获取。

Proxy 的 get 拦截规则:若访问的属性在实例上已存在(如 getset 等方法或 data 字段),直接返回实例属性;否则调用 getSync(key) 同步获取缓存值。

注意事项

  • 依赖 ramda 库:内部使用 isNil 来自 ramda,使用前需确保项目中已安装 ramda
  • 由于使用 Proxy 对象,不支持 IE 浏览器。
  • get 方法对异步 getter 才有意义,对同步 getter 也能工作(直接缓存同步结果)。
  • getSync 调用异步 getter 时只能拿到 Promise 对象,不能真正同步等到异步结果,所以异步 getter 应配合 get 使用。
  • set 方法对异步函数会立即执行并缓存;对同步函数仅注册不执行,需通过 get/getSync 触发。
  • refresh 仅清除内存缓存,不清除已注册的 option 中的 getter。
  • 实例的 optiondatapromiseInstance 为内部字段,不建议外部直接修改。

示例

基础用法

异步 getter 与请求去重

动态 set 与 refresh

浏览器兼容

由于使用 Proxy 对象,不支持 IE 浏览器,详细浏览器兼容性参考MDN Proxy 浏览器兼容性

性能考虑

  • get 内部使用 promiseInstance 做请求去重,避免并发场景下重复请求,时间复杂度 O(1)。
  • getSync 命中缓存时直接返回,无额外开销;未命中时同步调用 getter,复杂度取决于 getter 自身。
  • 由于使用 Proxy,每次属性访问存在轻微拦截开销,但对单次操作可忽略。
  • 缓存常驻内存,长期运行需注意单例仓库中数据量,必要时通过 refresh 或手动清理。

相关函数