位置: 编程技术 - 正文

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

  • 应收账款贷方余额怎么调平
  • 现金流量表填报说明
  • 网上认证勾选平台登录不成功
  • 虚增成本300万财务人员责任
  • 商贸公司营业执照范围
  • 企业跨年补开发票
  • 转让长期股权投资交什么税
  • 银行客户专用回单分录
  • 企业结转已销产品的生产成本
  • 预缴企业所得税是含税数还是不含税
  • 企业所得税少交了被税局查到怎么处理
  • 公司在外地
  • 增值税2017年起征点
  • 小规模纳税人怎么算税
  • 办公室房租计入什么科目
  • 专票已经认证能作废吗
  • Windows10如何切换中英文输入法
  • 印花税本月计提本月缴纳
  • ppt文件打不开了怎么办
  • win7系统管理员密码忘了怎么办
  • tplink路由器怎么连接无线网络
  • 个体户流水过大怎么避税
  • php源码怎么上传到服务器
  • 差旅费是否可以所得税前扣除
  • 没有取得发票的支出可以做成本吗
  • 土地增值税预征的计征依据=预收款-应预缴增值税税款
  • php strrev
  • 用php做计算
  • 年报中投资总额怎么填
  • php 封装
  • 检测费的税票税率怎么算
  • win11永久关闭桌面弹出广告
  • accubattery准确性
  • 四轮电车电机价格
  • 中兴网管操作手册
  • 长期借款科目的借方反映的内容
  • 递延所得税资产和所得税费用的关系
  • 存货非正常损失可以所得税前扣除吗
  • 收取房屋租赁费的会计分录
  • 外商投资企业wofe
  • 没授权的帝国cms作为商用行吗
  • MySQL Proxy的安装及基本命令使用教程
  • 帝国cms获取当日发布的url链接
  • 生产辅助
  • 长期股权投资减值准备是什么科目
  • mysql显示数据库中的表
  • 保险公司委托代征是什么意思
  • 营改增后简易计税是多少税率
  • 政府补助的范围
  • 折扣 会计处理
  • 从公司账户转给他人私户1万元以内需要扣多钱的税
  • 少交税款滞纳金
  • 医保卡里收入和余额不一样
  • 个人开具的收据能税前扣除吗
  • 享受研发费用加计扣除需要什么条件
  • 残保减免金政策
  • 报关单填制的运费怎么算
  • 待处理财产损益借贷方向
  • 商品降价如何进行投诉
  • 平均净资产是什么意思
  • 关闭terminal monitor
  • linux系统清理磁盘空间
  • windows已保护你的电脑,阻止你的应用
  • windows xp操作
  • win7系统如何提升性能
  • mac版安装教程
  • linux修改时间格式
  • 如何手动修改VID与PID
  • win7连接VPN时提示800错误怎么办 连接VPN时提示错误800解决方法
  • linux显示所有内容
  • Extjs4中的分页应用结合前后台
  • django 实例
  • cocos2d怎么用
  • vue stylus
  • javascript要怎么学
  • jquery日期控件 datepicker
  • jquery easyui 教程
  • jquery设置input的value
  • 新旧动能转换是我们能否过坎的关键
  • 房山税收减免政策文件
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设