位置: 编程技术 - 正文

对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当前时间)

  • 代开的增值税专票需要另外申报附加税吗?
  • 销售货物的运费计入成本吗
  • 公允价值变动损益影响营业利润吗
  • 两个公司发工资怎么交个税
  • 稳岗补贴属于不征税收入吗
  • 银行对账单放前面还是放后面
  • 工会筹备金需不需要计提
  • 电梯维保费属于建筑服务吗
  • 非营利组织缴纳社保
  • 建筑企业外地预缴
  • 劳务报酬和工资薪金哪个税率高
  • 小规模增值税做那个费用科目
  • 股权转让资产怎么清算
  • 行政单位在建工程入账
  • 不动产在建工程使用的外购货物
  • 银行承兑汇票置换业务自签发之日起新票的最长期限为
  • 个体工商户该如何交税
  • 市政配套费交给哪个部门
  • 深圳制造业税收
  • 土地增值税按什么面积征收
  • 产品售后服务规定
  • 固定资产加速折旧最新政策2023
  • 工程中材料超耗怎么处理
  • 注册资金印花税什么时候开始交
  • 上年度职工工资总额
  • 资产评估入账的评估报告
  • 高新技术企业研发费
  • 免征附加税费
  • 施工图审查费入哪个科目
  • 营改增之后账务怎么处理
  • PHP:class_uses()的用法_spl函数
  • 进出口企业税务怎可以查出问题
  • 弗洛雷斯岛
  • php模拟表单提交
  • 社保缴费基数差1000一般差多少?
  • 非常好看的头像
  • yolo系列算法全家桶
  • 手把手教你用Excel制作考勤表
  • 机器学习中的数学——距离定义(八):余弦距离(Cosine Distance)
  • 会计常用单据样本大全
  • 个人独资企业只有收入没有成本和费用
  • php网站漏洞
  • java中反射
  • 不动产的进项税额转出
  • 土地增值税预缴计算方法70号公告
  • 处置固定资产亏损,增值税所得税申报不一至情况说明
  • 对公转账房租如何填写备注
  • 应付账款不需要支付了会计怎么处理
  • 现金流量套期与公允价值套期的区别
  • 企业培训费怎么入账
  • 零税率发票有法律效力吗
  • 会计手工做账的目的
  • 生产过程中的不良品怎么处理
  • 其它权益工具投资和其他债权投资
  • 金税盘减免税款分录
  • 资本公积可用于弥补企业亏损
  • mysql存储过程的语句块以什么开始以什么结束
  • sql汇总查询
  • windows如何安装安卓软件
  • CentOS上使用Squid+Stunnel搭建代理服务器教程
  • win10预览版绿屏重启解决
  • pc是什么软件
  • win7突然变卡顿怎么回事
  • win8怎么打开远程连接
  • win7系统怎么将新建资料保存到文件夹
  • Extjs 4.x 得到form CheckBox 复选框的值
  • 只有一行的矩阵的逆矩阵
  • unity游戏开发入门经典
  • asm指令
  • jquery 获取json的key
  • vue.js 开发工具
  • scp 将数据从一台linux服务器复制到另一台linux服务器
  • javascript基础书
  • python3 冒泡排序
  • android的基础知识
  • python5.7汉诺塔
  • 小规模纳税人每季度不超过30万免税
  • 深圳罗湖区公安局长安慧君简历
  • 税务代收是什么意思
  • 定额发票作废了还能报销吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设