位置: 编程技术 - 正文

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

  • 消费税的会计分局
  • 会计核算职能有哪些特征
  • 医院能否开具增值税专用发票
  • 购入交通运输设备计入什么科目
  • 付款单位与开票单位不一致如何做账?
  • 事业单位无形资产管理制度
  • 企业合并怎么做账
  • 公共电话亭的话费收入如何做税务处理呢?
  • 当年应收账款无明细科目
  • 汇算清缴期结束后税务机关发现企业应当取得而未取得
  • 发票报销哪些能用专票
  • 支付税点怎么做账
  • 如何开具红字增值发票
  • 价内税包括
  • 当前一般纳税人增值税税率
  • 个税申报中劳务报酬
  • 合伙企业分红是免税企业需要缴纳什么税
  • 1697507882
  • 可供出售金融资产发生减值会计处理
  • 收到预付款怎么给客户写协议书
  • php输出当月日历
  • PHP:curl_getinfo()的用法_cURL函数
  • php 算法
  • anaconda的虚拟环境的作用
  • 怎么开通公众号微信公众平台
  • 稽查查补销售额后补开票如何申报
  • json解析格式
  • 溢价收购股权会计处理案例
  • 销售费用属于损益类科目的收入还是费用
  • php -a
  • python的Django框架
  • js正则用法
  • 增值税专用发票有几联?
  • linux在查找zip里的文件
  • python变量赋值的正确方法
  • 扣税免除项
  • mongodb如何修改数据
  • 公司给员工交社保对公司有什么好处
  • 公司开一般户需要多久
  • 个税申报中本人扣除比例什么意思
  • 环保税计税依据怎么算
  • 销售货物应税劳务清单怎么填
  • 水利基金差额征收有哪些类型
  • 国家税务总局就是国税局吗?
  • 单位房屋出租收入应交哪些税
  • 专票信息技术服务费
  • 现金短缺与溢余解析
  • 材料按计划成本计价下,外购材料结算
  • 扣税时账上没钱怎么办
  • 中秋过节费会计分录
  • 收据大写后面的字怎么写
  • 票折费用是什么意思
  • 电子支付支付是什么意思
  • 主营业务收入少计跨年调整
  • 电脑算固定资产哪一类
  • windows server2008 64位没有安装音频怎么办?
  • haozipsvc.exe是什么
  • vmware 10虚拟机
  • win8.1 升级
  • mac的浏览记录在哪儿
  • Linux系统中quota磁盘命令的相关使用解析
  • centos7图形安装
  • win10 20h2 v2
  • mac阻止itunes自动弹出
  • win1020h2累积更新
  • win8系统谷歌浏览器打不开
  • unity3ds
  • cocos2dx schedule
  • js上滑翻页
  • python函数经典例程
  • unity 1
  • node.js中http模块和url模块的简单介绍
  • 大叔sam1
  • js表单事件有哪些
  • js类继承的例子
  • java与android的区别
  • android开发—01开发环境的搭建
  • 高速发票查询平台官网
  • 淮北税务局领导简介
  • 环保税申报操作手册
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设