如何用J*aScript实现一个网络请求的缓存与去重策略?


先查缓存再判断进行中请求,最后发起新请求。通过Map实现缓存与去重,减少重复请求、提升性能,适用于频繁点击、搜索补全等场景,需注意缓存有效期和错误处理。

如何用javascript实现一个网络请求的缓存与去重策略?

在前端开发中,频繁的网络请求会影响性能和用户体验。通过实现缓存与去重策略,可以有效减少重复请求、降低服务器压力并提升响应速度。以下是使用 J*aScript 实现网络请求缓存与去重的核心思路和代码示例。

1. 使用 Map 实现请求缓存

将已成功返回的数据按请求参数存储,下次相同请求直接返回缓存结果。

关键点:

  • 用 URL 和参数生成唯一键
  • 设置可选的过期时间
  • 返回 Promise 保持接口一致性
const cache = new Map();

function generateKey(url, options) {
  const params = JSON.stringify(options?.body || {});
  return `${url}#${options?.method || 'GET'}#${params}`;
}

async function cachedFetch(url, options = {}) {
  const key = generateKey(url, options);
  const cached = cache.get(key);

  if (cached && Date.now() < cached.expiry) {
    return cached.data;
  }

  try {
    const response = await fetch(url, options);
    const data = await response.json();

    // 缓存10秒,可配置
    cache.set(key, {
      data,
      expiry: Date.now() + 10000
    });

    return data;
  } catch (error) {
    // 若无缓存则抛出错误
    if (!cached) throw error;
    return cached.data;
  }
}

2. 防止重复请求(去重)

当相同请求同时发起时,避免创建多个 fetch 实例。共享同一个 Promise 可解决此问题。

YouMind YouMind

AI内容创作和信息整理平台

YouMind 207 查看详情 YouMind

做法:

  • 维护一个正在进行中的请求映射表
  • 如果请求已在进行,返回对应的 Promise
  • 请求结束后从表中清除
const pendingRequests = new Map();

async function deduplicatedFetch(url, options = {}) {
  const key = generateKey(url, options);

  // 如果已有相同请求在进行,复用其 Promise
  if (pendingRequests.has(key)) {
    return pendingRequests.get(key);
  }

  const requestPromise = fetch(url, options)
    .then(async res => {
      if (!res.ok) throw new Error(res.statusText);
      return res.json();
    })
    .finally(() => {
      pendingRequests.delete(key);
    });

  pendingRequests.set(key, requestPromise);
  return requestPromise;
}

3. 结合缓存与去重的完整方案

先查缓存,再判断是否已有进行中的请求,最后发起新请求。

async function smartFetch(url, options = {}, { ttl = 10000 } = {}) {
  const key = generateKey(url, options);

  // 1. 检查缓存
  const cached = cache.get(key);
  if (cached && Date.now() < cached.expiry) {
    return cached.data;
  }

  // 2. 检查是否有进行中的请求
  if (pendingRequests.has(key)) {
    return pendingRequests.get(key);
  }

  // 3. 发起新请求
  const requestPromise = fetch(url, options)
    .then(async res => {
      if (!res.ok) throw new Error(res.statusText);
      const data = await res.json();

      // 更新缓存
      cache.set(key, {
        data,
        expiry: Date.now() + ttl
      });

      return data;
    })
    .catch(err => {
      // 请求失败但有旧缓存时返回旧数据
      const fallback = cache.get(key);
      if (fallback) return fallback.data;
      throw err;
    })
    .finally(() => {
      pendingRequests.delete(key);
    });

  pendingRequests.set(key, requestPromise);
  return requestPromise;
}

基本上就这些。这个方案适用于按钮频繁点击、自动补全搜索、轮询等场景。注意根据业务需求调整缓存有效期和清理策略,比如定期清空过期项或限制最大缓存数量。不复杂但容易忽略细节,尤其是错误处理和缓存更新时机。

以上就是如何用J*aScript实现一个网络请求的缓存与去重策略?的详细内容,更多请关注其它相关文章!


# 多个  # SEO行业运营管理简历  # 阿坝seo哪家好  # 网站平台运营推广  # 南昌营销推广价钱高  # 网站建设售后如何  # 错误的seo观念  # 抖音seo搜索的ppt  # 龙岩抖音搜索seo推广  # 常德靠谱营销推广  # 芜湖德阳网站优化服务  # 已在  # 解决问题  # 中文网  # 相关文章  # 缓存  # 尤其是  # 加载  # 适用于  # 已有  # 如何用  # ai  # 前端开发  # json  # 前端  # js  # java  # javascript  # 去重 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 微信步数怎么刷_微信步数快速提升技巧  12306APP选座怎么选充电位置_12306APP带充电插座座位选择方法与技巧  WPS长文档分栏排版不乱方法_WPS分栏+分节符报纸排版教程  AffinityDesigner图层蒙版怎么用_AffinityDesigner图层蒙版设计应用  《红果免费短剧》下载观看方法  mysql离线安装后如何启动_mysql离线安装完成后启动服务的方法  Win10截图远程协助 Win10远程桌面截屏法【场景应用】  C++中的explicit关键字有什么作用_C++类型转换控制与explicit使用  Python中对象引用与链表属性赋值的机制解析  搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能  QQ网页版入口导航 QQ网页版在线访问通道  《美篇》取消会员自动续费方法  手机远程连接电脑方法  抖音团长模式怎么做?团长模式是什么意思?  优化Asyncio嵌套函数调度:使用生产者-消费者模式实现并发流处理  mysql镜像配置如何恢复数据_mysql镜像配置数据恢复详细流程  泰拉瑞亚网页版在线登录入口 泰拉瑞亚官方正版入口  Win10怎么设置快速启动 Win10开启快速启动设置方法  解决CSS background 属性中 cover 关键字的常见误用  抖音号升级成企业资质怎么弄?有什么好处?  苹果官网国补入口在哪  店铺如何做视频号推广?做视频号推广有用吗?  《随手记》备份数据方法  J*aScript字符串_Unicode处理  背部总是隐隐作痛怎么回事 背痛如何改善  《跳跳舞蹈》循环播放方法  消除网页顶部意外空白线:CSS布局常见问题与解决方案  芒果TV官网登录入口 芒果TV官方网站登录入口  J*aScript大数运算_BigInt使用指南  PHP odbc_fetch_array 返回值处理:如何正确访问嵌套数组元素  优酷下载视频的清晰度怎么选_优酷缓存清晰度设置与选择指南  解决 Vue 3 组件未定义错误:理解 createApp 与根组件的正确使用  2025考研成绩查询时间入口分享  《异星探险家》古怪的物品作用介绍  解决VS Code中Python版本冲突与输出异常的指南  包子漫画官网链接官方地址 包子漫画在线观看官网首页入口  一加 Ace 6V 快充无法启用_一加 Ace 6V 充电优化  RxJS中如何高效地在一个函数内处理和合并多个数据集合  视频号视频怎么提取文案?提取的文案如何优化与使用?  聚水潭ERP后台管理系统登录 聚水潭ERP官方登录通道  动漫岛汉化官网网 动漫岛官方动漫汉化地址  Dash应用多值文本输入处理与类型转换教程  composer 提示 "requires ext-soap" 缺少 SOAP 扩展怎么办?  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  Flask 应用中图片动态更新与上传:实现客户端定时刷新与服务器端文件管理  悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置  可米酷漫画在线阅读入口_ 可米酷漫画官网直达链接  TikTok搜索结果不显示怎么办 TikTok搜索刷新与优化方法  附近酒吧怎么找?  Animex动漫社正版在线入口 Animex动漫社动漫官方观看网 

 2025-10-02

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.