用 map 缓存异步请求结果的核心是缓存 promise 实例,以实现请求去重与结果共享;key 用规范化字符串(如 json.stringify),命中则复用 promise,失败或完成后可清理以避免内存泄漏。

用 Map 缓存异步请求结果,核心是把请求参数(如 URL + 请求体)作为 key,把 Promise 或响应数据作为 value,避免重复发起相同请求。
用 Map 缓存 Promise(推荐:防重复请求)
最实用的方式是缓存 Promise 实例本身,而不是最终数据。这样同一请求在 pending 状态时,后续调用直接复用该 Promise,自然实现“请求去重”和“结果共享”。
- key 通常用 JSON.stringify({ url, method, body }) 或自定义规范化字符串(注意处理 undefined、函数、Date 等不可序列化值)
- 请求发起前先查 Map;命中则直接返回缓存的 Promise;未命中则发起新请求,并把 Promise 存入 Map
- 请求完成后(无论成功或失败),建议从 Map 中删除该 key(可选),或保留一段时间后清理(避免内存泄漏)
缓存响应数据(适合只读、低频变更场景)
如果接口数据长期稳定(如配置项、字典表),可缓存解析后的数据(如 response.json() 的结果),而非 Promise。但要注意手动管理过期逻辑。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 存数据时可附加时间戳,读取前判断是否超时(例如 5 分钟内有效)
- 更新数据时需主动 delete 对应 key,或用弱引用/定时器自动清理
- 不适用于频繁变动或强实时性要求的接口(比如用户余额、订单状态)
一个轻量封装示例
下面是一个基于 Map 的 fetch 缓存工具片段(仅示意,生产环境建议加错误处理和清理机制):
const cache = new Map();
async function cachedFetch(url, options = {}) {
const key = JSON.stringify({ url, ...options });
if (cache.has(key)) {
return cache.get(key);
}
const promise = fetch(url, options)
.then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
});
cache.set(key, promise);
try {
const data = await promise;
return data;
} catch (err) {
cache.delete(key); // 失败时清除,避免下次仍返回 rejected promise
throw err;
}
}
注意事项
Map 缓存是内存级的,不跨页面、不持久化。刷新页面即丢失。需要持久缓存请结合 localStorage / IndexedDB。
- key 设计要保证“相同语义请求得到相同 key”,比如忽略 undefined 字段、统一排序对象键、标准化 query 参数顺序
- 大量请求可能让 Map 持续增长,建议配合 LRU 策略或 TTL 清理(可用第三方库如 lru-cache,或自己维护时间戳+定期扫描)
- GET 请求适合缓存;POST/PUT 等非幂等请求慎用缓存,除非明确知道业务允许复用结果
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










