核心是缓存 Promise 实例而非最终结果,同一参数下所有调用共享一个 Promise 以避免重复请求;因异步操作具不确定性,缓存 Promise 才能准确标识“请求是否进行中”;通过闭包封装 Map 实现私有缓存,命中则返回已有 Promise,未命中则创建并存入,失败时删除以支持重试。

核心是缓存 Promise 实例本身,而不是最终结果。同一请求参数下所有调用共享一个 Promise,后续调用直接复用,自然避免重复发起网络请求。
为什么必须缓存 Promise 而不是返回值
异步资源加载有不确定性:可能失败、可能重试、可能正在途中。如果只缓存最终数据(比如 config 对象),那首次请求失败后,缓存就为空或无效,下次调用又得重发;如果每次调用都 new Promise,就彻底失去“单例”意义。缓存 Promise 才能真实反映“这个请求是否已在进行中”。
用闭包封装私有缓存 Map
闭包提供天然的私有作用域,适合存放缓存容器而不污染全局:
- 用 Map 存储「请求标识 → Promise」映射,键可以是 URL 字符串,或序列化后的参数对象
- 每次调用先查 Map,命中则直接返回已有 Promise
- 未命中则创建新 Promise,存入 Map 后再返回
- Promise 拒绝时主动从 Map 中删除,允许后续重试
典型实现结构
例如按 URL 加载 JSON 配置:
const ConfigLoader = (function() {
const cache = new Map();
function load(url) {
if (cache.has(url)) return cache.get(url);
const promise = fetch(url)
.then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
})
.catch(err => {
cache.delete(url);
throw err;
});
cache.set(url, promise);
return promise;
}
return { load };
})();
调用 ConfigLoader.load('/api/config') 多次,只会触发一次 fetch 请求,其余调用拿到的是同一个 Promise 实例。
扩展考虑点
- 参数更复杂时,可用
JSON.stringify(params)生成缓存键,注意保证参数顺序一致 - 需支持过期策略时,可在 Map 中存 { promise, timestamp },读取前判断是否超时
- 多实例隔离需求(如不同用户 token)可通过外层工厂函数实现,让每个实例拥有独立 cache
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










