直接缓存 promise 实例是解决并发重复请求最有效的方式,它通过共享 pending 状态的 promise 避免冗余请求,而单纯缓存数据会导致竞态问题;需配合错误清除、参数化 key 生成、ttl 过期控制及 promise.resolve 统一接口。

直接缓存 Promise 实例,而不是缓存最终数据,是解决并发重复请求最有效的方式。它天然规避竞态问题,让多次调用共享同一个异步过程。
为什么不能只缓存数据?
单纯缓存返回值(比如一个用户对象)在并发场景下会失效。例如两个组件同时调用 getUser(123),若缓存逻辑写成“没数据就发请求、再存结果”,那么两个调用都发现缓存为空,就会各自发起一次网络请求——造成冗余请求和资源浪费。
而 Promise 缓存把“正在请求中”这个状态也纳入缓存:第一次调用生成并缓存一个 pending 状态的 Promise;后续调用直接复用它,等它 settle 后所有监听者一并收到结果。
基础 Promise 缓存实现
用 Map 存储 key → Promise 映射,核心逻辑简洁明确:
- 检查 Map 中是否存在对应 key 的 Promise
- 不存在则调用原始 API,得到 Promise 后存入 Map 并返回
- 存在则直接返回该 Promise,不触发新请求
示例代码:
const userCache = new Map();<br>function getUser(id) {<br> if (!userCache.has(id)) {<br> const promise = fetch(`/api/users/${id}`).then(r => r.json());<br> userCache.set(id, promise);<br> }<br> return userCache.get(id);<br>}注意:错误处理需主动清除缓存,否则失败的 Promise 会一直卡住后续调用:
const promise = fetch(...).then(...).catch(err => {<br> userCache.delete(id); // 清除失败缓存<br> throw err;<br>});支持参数化与过期控制
真实业务中,API 往往带动态参数(如分页、筛选),且缓存不能永久有效。这时需:
- 用 JSON.stringify 或更健壮的键生成策略(如 `${url}-${JSON.stringify(params)}`)构造唯一 cache key
- 引入时间戳或 TTL 机制,在读取前判断是否过期;过期则删除旧 Promise,重新发起请求
- 可封装为高阶函数,如 createPromiseCache(fn, { ttl: 5 * 60 * 1000 })
与 Promise.resolve 配合统一处理流
当某些路径能走缓存、某些必须实时获取时,用 Promise.resolve 可保持调用链一致:
- 缓存命中 → 返回已存在的 Promise
- 缓存未命中 → 调用 API,返回新 Promise
- 兜底场景(如离线)→ Promise.resolve(defaultData),让 .then() 逻辑无需区分同步/异步
这样整个数据加载流程对外始终是 Promise 接口,上层消费代码干净无分支。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











