You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript异步函数的单例模式实现方案问询

异步API请求的单例缓存解决方案

你的问题出在缓存时机不对:当前代码只缓存了API返回的最终数据,但第一次调用data()时,await dataFromAPI()会让函数暂停,此时dataCache还是undefined。这时候第二次调用data(),依然会进入请求逻辑,导致重复发起API调用。

解决思路很简单:缓存Promise本身,而不是等待Promise完成后再缓存结果。这样第一次调用时就把请求的Promise存起来,后续所有调用直接复用这个Promise,自然不会重复请求。

修改后的代码如下:

let dataCache;

const data = async () => {
  if (dataCache) return dataCache;
  // 直接缓存请求的Promise,不用等await完成
  dataCache = dataFromAPI();
  return dataCache;
}

如果dataFromAPI不是返回Promise的异步函数(比如它本身就是普通函数),也可以这样写,确保缓存的是Promise:

let dataCache;

const data = async () => {
  if (dataCache) return dataCache;
  // 缓存整个async函数的Promise
  dataCache = (async () => {
    const apiResponse = await dataFromAPI();
    return apiResponse;
  })();
  return dataCache;
}

现在再测试连续调用:

data().then(response => console.log(response))
data().then(response => console.log(response))

只会发起一次API请求,两个then都会拿到同一个响应结果,完美实现会话周期内的单例请求。

内容的提问来源于stack exchange,提问作者henryaaron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:32:10