位置: 编程技术 - 正文

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

  • 增值税普通发票几个点
  • 公司不开票要交工会经费吗
  • 企业一般会涉及哪些行业
  • 投资收益免征企业所得税
  • 购进生产设备的会计分录
  • 新增资产额怎么计算
  • 总产值和主营业务收入
  • 红字发票已抵扣和未抵扣是什么意思
  • 公司车辆的维修费挂什么科目
  • 预售房款预缴增值税
  • 基建贷款贴息账户有哪些
  • 赠送固定资产会计处理
  • 去年的成本没有入账
  • 公户可以在淘宝下单吗
  • 年末结转本年利润是在结转损益前还是后
  • 土地款抵扣增值税申报
  • 企业并购金额如何确定
  • 哪些税不可以扣除
  • 从国外进口的免税商品
  • 企业收入进私户怎么做账
  • 期末余额全部转出的有哪些
  • 商业保险可以税前扣除多少
  • 资金使用计划表怎么写
  • 短期投资算债权吗
  • 债务利率的公式
  • 年度成本费用利润率多少合适
  • tplink路由器怎么连接无线网络
  • linux 数字加减
  • 怎么关闭windows defender
  • php integer
  • 蓝莓外面的霜
  • php调用远程桌面
  • uniapp仿微信
  • 行政事业性收费目录
  • 无形资产相关税费
  • 金融商品转让业务包括
  • php获取网页所有页数
  • mysql 长事务
  • 外管证注销后发票还可以重开吗?
  • phpcms专题页面模板
  • dede插件
  • github+hexo搭建博客
  • 预收账款什么时候确认增值税
  • 企业报废车辆如何做账
  • 机器设备计提折旧纳税调整
  • 低值易耗品摊销计入什么科目
  • 金税盘和报税盘一起用吗
  • 餐饮费发票可以抵扣进项税吗
  • 所得税费用如何计提分录
  • 企业给员工单独交社保
  • 运费开什么发票
  • 河道管理费和水利基金
  • 普通发票记账联盖章了怎么办
  • 转回存货跌价准备对递延所得税资产的影响
  • 资金会计应当设置的科目
  • mysql安装不成功怎么办
  • mysql的zip包怎么安装
  • win10如何设置快捷键
  • Vista 优化预读文件设置,提速开关机速度
  • win10升级20h
  • centos默认字体
  • Win7系统打印机共享无法保存打印机设置0x000006d9
  • win10官方升级工具升级
  • win10系统如何设置不休眠
  • 最新版win10版本号
  • javascript如何定义变量
  • nodejs自动生成接口文档
  • cocoscreator lua
  • JavaScript中的math.pi
  • android中启动service的方法有
  • js table
  • 在python中的用法
  • 境外取得收入申报期限
  • 酒精是否缴纳消费税
  • 总分机构在同一县城企业所得税需要预交吗
  • 国家税务总局朝阳税务局
  • 国家税务总局辽宁省税务局
  • 怎么注册山东省采购网
  • 科技公司小规模纳税人与一般纳税人区别
  • 办税服务厅是税收工作的
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设