高阶函数实现请求缓存层,通过闭包维护基于 JSON.stringify(args) 的键值缓存对象,支持异步、TTL 过期、force 强制刷新及仅 GET 缓存;示例 cachedFetch 封装 fetchFn,返回带记忆能力的 Promise 函数。
用高阶函数实现请求缓存层,核心是把“发请求”这个动作封装成可记忆、可复用的函数,避免相同参数反复调用后端。它不依赖框架或第三方库,靠闭包维持缓存状态,轻量且可控。
高阶函数接收原始请求函数,返回一个带记忆能力的新函数:
=== 比较会失败)JSON.stringify(args) 把参数转为唯一字符串 key纯计算缓存(如 add(2))和请求缓存有本质区别:HTTP 请求可能失败、需支持过期、要兼容 Promise。所以实际封装时需补充:
force: true 参数跳过缓存下面是一个生产环境可用的简化版:
const cachedFetch = (fetchFn, ttl = 5000) => { const cache = {} return async (...args) => { const key = JSON.stringify(args) const now = Date.now()<pre class='brush:php;toolbar:false;'>if (cache[key]) { const { data, timestamp } = cache[key] if (now - timestamp < ttl) return data}try { const data = await fetchFn(...args) cache[key] = { data, timestamp: now } return data} catch (err) { // 缓存失败时不写入,避免脏数据 throw err}
}}
// 使用方式const apiGetUser = (id) => fetch(/api/user/${id}).then(r => r.json())const cachedGetUser = cachedFetch(apiGetUser, 10000)
cachedGetUser(123) // 首次请求,走网络cachedGetUser(123) // 10 秒内再次调用,直接返回缓存结果
高阶函数缓存适合做「请求粒度」控制,但不宜替代整体数据流管理:
useMemo 或自定义 Hook 封装,避免组件重渲染时重复初始化缓存函数