位置: 编程技术 - 正文

对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解

编辑:rootadmin

推荐整理分享对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

虽然jquery的较新的api已经很好用了, 但是在实际工作还是有做二次封装的必要,好处有:1,二次封装后的API更加简洁,更符合个人的使用习惯;2,可以对ajax操作做一些统一处理,比如追加随机数或其它参数。同时在工作中,我们还会发现,有一些ajax请求的数据,对实时性要求不高,即使我们把第一次请求到的这些数据缓存起来,然后当相同请求再次发起时直接拿之前缓存的数据返回也不会对相关功能有影响,通过这种手工的缓存控制,减少了ajax请求,多多少少也能帮助我们提高网页的性能。本文介绍我自己关于这两方面问题的做法,欢迎交流和指正。

点击 代码下载 (注:因为用到了ajax,所以不能在file协议下运行,必须运行在http下)

1. 封装jquery的ajax

其实这个部分的相关内容在之前的一篇博客引入过,只不过那里面只是引用,没有详细说明,另外ajax缓存代理组件的实现也是基于这个二次封装之后的ajax组件的,所以有必要在这里对它详细说明一下,虽然实现并不复杂(详见注释说明):

这个Ajax组件主要做的事情是: 1)统一提供随机数参数和ajax请求标识; 2)对jquery的api进行了包装,对外提供的方法更加清晰明了。

使用方式:

由于这个组件的每个实例方法返回的对象就是$.ajax创建的对象,所以我们完全可以照常使用.done .fail .always来添加回调,就跟直接用$.ajax没有任何区别。为什么API要设计成html, get, post, syncGet, syncPost这几个方法,而且连dataType基本都是固定的?

那是因为在项目中,我们完全可以约定在异步请求的时候只能用html或json这两种dataType,其它dataType不允许,现在的web项目这两种方式已经完全够用了,至少我没有碰到过非得使用别的dataType不可的情况;而且在实际工作当中html, get, post, syncGet, syncPost这几个方法几乎能够涵盖我们需要的所有异步请求的场景,每当我们要用ajax的时候,无非考虑的就是get还是post,同步还是异步,请求的是html还是json这三个问题,通过它们就能把每个问题都解决了。当然jsonp,rest API这两种情况就另说了,这个组件不是为它们服务的,这也是它的局限性,它还是倾向于在传统的web项目中使用。

2. ajax缓存代理

要实现一个简单的ajax缓存代理组件,首先要清楚这个缓存代理的作用,在本文开篇说到过缓存代理的应用场景:当使用缓存代理第一个发起某个请求时,在请求成功后将数据缓存下来,然后当再次发起相同请求时直接返回之前缓存的数据,缓存代理的作用是控制何时发送请求去后台加载数据,何时不发送请求直接从缓存中读取之前加载的数据。为了实现一个简单的缓存代理,有三个问题要解决:

对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解

1)代理对象必须与被代理的对象有相同的API 拿前面的Ajax组件来说,它提供有html, get , post, syncGet, syncPost方法,那么它的代理对象也必须同时具有这些方法,而且调用方式,传入参数都必须完全一致,只有这样,当我们在使用代理对象的时候,就跟在使用原组件对象没有区别。而且在缓存代理内部,在某些条件下是需要调用原组件对象发送ajax请求的,如果接口不同,调用方式不同,参数不同,如何能保证内部能够正确调用原组件对象呢?这个条件还有一个好处,就是当我们下次不想使用代理对象的时候,能够以最小的代价将代理对象替换为原组件对象。 这一点其实是设计模式中代理模式的基本要求。

2)缓存数据存储时的缓存索引问题 也就是说我们以什么样的索引才能保证同一个请求的数据在缓存之后,下次查找时还能根据请求信息查找到呢?ajax缓存有别于其它缓存的地方在于它请求的地址可能包含可变的参数值,同一个地址如果后面的参数不同,那么对应的请求结果也就不一定相同,所以简单起见,可以考虑把请求地址跟请求参数统一作为缓存索引,这样就能对缓存进行简单管理。同时考虑到其它可变性,还应有其它的一些要求,详见后面组件实现中的注释说明。

3)缓存有效时间 虽然要实现的缓存代理很简单,但是这个问题一定是要考虑的,每个缓存代理实例,能够缓存数据的有效时间不一定相同,有的可能只缓存几分钟,有的可能缓存几十分钟,当缓存时间失效时,缓存代理就得删除原来的缓存,然后重新去加载数据才行。

综合这些问题,基于第一部分的Ajax组件,最终实现的缓存代理组件AjaxCache的代码如下(有注释详解):

在第一部分和本部分的实现中,最关键的都是那个立即调用的函数表达式,没有它返回的闭包,代码就会有问题,这也是闭包在循环中应用的经典问题。

3. 演示效果

为了说明缓存代理的使用效果,我做了一个演示效果: 其中的ajax.js就是第一部分的实现,ajaxCache.js就是第二部分的实现,演示页面对应代码中的html/demo.html,相关js是js/app/demo.js:

在这个代码中,我创建了一个代理对象,能将ajax请求缓存s,用一个定时器一共调用代理对象五次get方法来发送同一个请求,最终打印效果如下: 从结果来看,整个代码执行了s,代理发送请求的时间点分别是第4s,第8s,第s,第s和第s。由于代理的缓存有效时间是s,且第4s是第一次发送请求,所以此时肯定会发送真实的ajax请求;当第8s和第s的代理发送同一请求时,由于距离缓存的时间只过去了4s和8s,所以缓存还是有效的,这两个时间点都没有发送实际的ajax请求;但是当第s的请求发送时,距离第一次请求的缓存时间已经过去s,缓存已经失效,所以代理又发送了一次真实的ajax请求,然后缓存被刷新;第s的请求还是在最新的缓存有效时间内,所以也没有发送实际的ajax请求。最后在network中可以看到代理发送了5次请求,但是只请求了2次服务,如果把缓存有效时间延长,就能再减少请求后台的次数,这也是缓存代理对前端性能提升的关键。

希望这个演示效果能够让你更加清楚地了解缓存代理的作用。

4. 本文总结

本文第1部分总结的实现在我自己的工作中应用很多,至少没碰到什么问题,不过也有可能是我没遇到,毕竟那个组件实现还是有不少约束的。第2部分的实现我也是刚刚应用到工作中去,正好有一个功能我考虑到有缓存的必要性,于是就写了一个较为简单的实现,虽然简单,但是已经能解决我的问题了,实际工作本来就是这样,有些东西没必要事无巨细的在事前就设计地很完美,先解决问题,然后在遇到新问题的时候再回来重构,有时也是一种更好的工作方法。下一篇博客介绍另外一个用到缓存代理的组件的实现思路,跟省市级联类似的功能,不过我想的是写成通用性更强的,能够与html结构和css尽可能分离的组件,请您继续关注。

以上这篇对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持积木网。

jquery中实现时间戳与日期相互转换 直接看代码:提醒:不要忘记了引用jquery的类库(function($){$.extend({myTime:{/***当前时间戳*@returnintunix时间戳(秒)*/CurTime:function(){returnDate.parse(newDate())/;},/*

DIV随滚动条滚动而滚动的实现代码【推荐】 记得以前写这样的代码比较麻烦,现在有了JQuery简单多了,就几行代码搞定!scripttype="text/javascript"src="Js/jquery-1.7.2.min.js"/scriptscripttype="text/javascript"$(funct

更高效的使用JQuery 这里总结了8个小技巧 1、DOM遍历是昂贵的,将变量缓存起来。//不推荐varh=$('#ele').height();$('#ele').css('height',h-);//推荐var$ele=$('#ele');varh=$ele.height();$ele.css('height',h-);2、优化选

标签: 对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解

本文链接地址:https://www.jiuchutong.com/biancheng/384920.html 转载请保留说明!

上一篇:详解jQuery中的empty、remove和detach

下一篇:jquery中实现时间戳与日期相互转换(jquery当前时间)

  • 预付款发票能入账吗
  • 外部审计内容是什么
  • 装卸费发票怎么备注
  • 个体户核定征收需要做账吗
  • 更正个税申报需要做账吗
  • 经营范围没有的可以开票吗
  • 股票交易费用计算器
  • 500元以内的商品都有哪些
  • 物流商品采购价差如何做账
  • 可转换债券转股时股价高于转换价格
  • 公司注销实收资本可以退回股东吗?
  • 出口发票税率是怎么算的
  • 物业 免物业费
  • 贷款损失准备对不良贷款的比率称作
  • 增值税电子发票怎么作废
  • 房地产土地抵扣
  • 收承兑汇票还要交税吗
  • 小额零星业务上限是多少
  • 建筑公司一般纳税人增值税税率
  • 公司代缴的个税怎么查询
  • 自产自用设备税务处理
  • 电脑怎么更新系统日期
  • 个税手续费返还属于政府补助吗
  • 税前利润的公式有哪些
  • 普通年金的概念和内涵
  • 车辆理赔过程中,赔付款给谁
  • 收到服务费计入什么科目
  • mac电脑修改dns
  • PHP:session_is_registered()的用法_Session函数
  • 个人非货币性资产投资个人所得税
  • 转让股权怎么做会计分录
  • PHP:oci_field_scale()的用法_Oracle函数
  • ✝️ 强制 Vue 重新渲染组件的正确方法
  • citespace关键词共现分析
  • 企业和单位往来怎么做账
  • 支付的招标代理费计入成本还是费用
  • el-upload上传文件携带参数
  • 字节在互联网什么地位
  • 常见反爬策略
  • ChatGPT频频发疯!马斯克警告:AI将毁灭人类
  • 人工智能lisp
  • win11安卓子系统教程
  • rc远程桌面
  • 其他应收款抵货款怎么记账
  • 资产计税基础填资产原值吗
  • 房产税计入管理费用还是营业税金及附加
  • 公司注册实收资本能为0嘛
  • 销售折让的会计科目
  • 去年未分配利润为负什么意思
  • 保险经纪公司要提取风险准备金按什么规定
  • sql server复制表数据
  • sqlserver uuid怎么获取
  • 税务开票金额每个月有限制吗
  • 主营业务成本工资计提吗
  • 小规模公司用什么成本核算方法
  • 支付中标服务费借款情况说明怎么写
  • sqlserver数据库备份
  • windows2000怎么安装
  • iTunesHelper.exe是什么进程?iTunesHelper.exe系统错误怎么解决?
  • win10周年更新版是什么意思
  • win10ie
  • 怎么提高xp系统运行速度
  • win10如何使用usb无线网卡
  • win7系统的excel在哪里
  • windows执行bat脚本
  • 简单总结译码器和数据选择器的作用
  • 遍历目录文件
  • 控制程序的先后顺序是怎样的
  • js实现登录界面
  • node教学视频
  • 数据库的基本操作实验报告
  • 安卓手机更新时间
  • viewstock
  • javascript+
  • javascript面向对象精要
  • 北京市国家税务局电子税务局
  • 重庆国家税务电子税务局官网登录
  • 分公司的总公司
  • 如何查询甘肃省学业水平考试成绩
  • 个人领税票需要哪些资料
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设