核心思路是缓存 promise 本身以避免重复请求;用 ??= 实现单次初始化;用 map 按参数键做多实例缓存;用闭包隔离缓存作用域;结合 localstorage 做持久化兜底。

核心思路是缓存 Promise 本身,而非等待它 resolve 后的数据。这样无论请求处于 pending、fulfilled 还是 rejected 状态,后续调用都复用同一个 Promise,天然避免并发重复请求。
用 ??= 缓存未初始化的 Promise
利用空值合并赋值运算符(??=)实现“首次调用才创建、后续直接返回”的语义:
- 声明一个外部变量(如
let cache;),初始为undefined - 在异步函数中写
cache ??= fetchSomething();,其中fetchSomething()返回 Promise - 第一次执行时
cache为 falsy,触发赋值;之后始终跳过右侧表达式
✅ 优点:语法简洁、无额外依赖、适合单次初始化场景(如全局配置、用户信息)
用 Map 按参数键做多实例缓存
当请求依赖动态参数(如 userId、searchTerm),需按唯一键区分缓存:
- 用
Map存储key → Promise映射,key 可由 URL + JSON.stringify(params) 生成 - 每次请求先查 Map,命中则直接
return map.get(key);未命中则执行请求并map.set(key, promise) - 可配合定时器或 LRU 策略清理过期项(如设置 5 分钟 TTL)
✅ 适用:搜索建议、分页列表、详情页数据等参数化接口
用闭包封装状态,隔离不同调用上下文
避免全局污染和跨组件干扰,尤其适合可复用 Hook 或工具函数:
- 把缓存对象(如
const cache = new Map())定义在工厂函数内部 - 返回的请求函数通过闭包访问该 cache,每个调用方拥有独立缓存空间
- 例如多个搜索框各自维护自己的关键词缓存,互不干扰
✅ 优势:天然作用域隔离、无副作用、便于单元测试
结合 localStorage 做持久化兜底
对低频变更但高价值的数据(如用户权限、站点配置),可叠加浏览器存储:
- 请求前先读
localStorage.getItem(key),若存在且未过期,直接解析返回 - 请求成功后,同时写入内存缓存和
localStorage(带时间戳和版本) - 注意处理 JSON 序列化限制与存储配额(约 5–10MB)
⚠️ 提醒:敏感数据勿存 localStorage;更新后需主动清除旧缓存
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











