前端优化思路1-------“合并”ajax请求
来源:互联网 发布:实矩阵的奇异值分解 编辑:程序博客网 时间:2024/06/08 04:26
前言
当前的前端开发的优化已经有一套完整的套路,包括js、css优化,HTML优化,首屏数据请求优化等,本文主要讨论前端发
送ajax请求的优化思路。
浏览器并发请求数
浏览器在同一个时间发送的网络请求数;请求数超过了浏览器的最大并发数时,其余的请求只能在后面排队,必须等待前面
的请求完成后才能发送,如果一个页面的首屏请求数过大就会造成请求排队,页面展现时间延长、性能降低,所以需要合并js、css、图片
等文件以降低并发请求数。各个浏览器并发请求数对照表如下:
常见ajax请求问题
经常遇到这样的场景,由于后台代码是模块解耦(不能合并请求),有时候做一个功能需要调用不同模块的接口,这样导致
发送一个模块的ajax请求后必须等到success回调后再发送第二个模块ajax请求,这就是我们常说的嵌套ajax请求,如下:
$.ajax({ //发送第一个请求 url:"http://localhost/project/moduleOne/oneRequest", type:"GET", success:function(result){ if(result.success){ $.ajax({ //发送第二个请求 url:"http://localhost/project/moduleTwo/anotherRequest", type:"GET", success:function(result){ $.ajax({})...... //发送第N个请求 }, error:function(error){ } }); } }, error:function(error){ //handleError(error); }})
这样的场景是不是很熟悉呢?
这样导致这些请求是一个“同步”的状态,后面的请求必须等到前面的请求有返回结果才能发送,这样后面的所有请求就处
于“阻塞”状态;浏览器每发送一个请求,都有域名解析、TCP握手、服务器响应、浏览器解析等过程,在网络状态良好的情况下耗时大
概在300ms~600ms不等,如果请求是处于“同步”状态,那么一个完整的功能请求的耗时就是:
请求耗时 = 请求数 * (300ms~600ms)
既然浏览器有并发请求数,那么就可以利用这一特性进行ajax并发请求。
可靠地“合并”ajax请求
合并打了双引号,意思并不是真正地意义上的将多个请求合并成一个请求,而是同时发送多个请求,再将多个请求的结果进行
合并;如何发送请求后将返回结果进行可靠地合并呢?
我们可以利用前端的事件系统进行可靠地回调和合并,具体看代码和注释:
var allData = {}; //声明合并数据var requestNum = 3;//声明请求数,用于记录请求完成计数,每完成一个请求则减1,直到为0;$(document).bind("allRequestComplate",function(){//在document上绑定所有请求完毕的事件 doSomeThingWithAllData.call(this,allData);//执行需要合并数据的业务逻辑 $(document).unbind("allRequestComplate");//释放监听事件});//发送第一个请求$.ajax({ url:"http://localhost/project/moduleOne/oneRequest", type:"GET", success:function(result){ allData.moduleOneSuccessData = result; //将此请求的数据进行合并 }, error:function(error){ allData.moduleOneError = error;//错误也合并 }, complate:function(){ requestNum --; //此请求完成后,记录数减1 if(requestNum == 0){ //如果请求记录为0,则触发所有请求完成的监听回调 $(document).trigger("allRequestComplate") } }});//发送第二个请求$.ajax({ url:"http://localhost/project/moduleTwo/twoRequest", type:"GET", success:function(result){ allData.moduleTwoSuccessData = result; //将此请求的数据进行合并 }, error:function(error){ allData.moduleTwoError = error; }, complate:function(){ requestNum --; //此请求完成后,记录数减1 if(requestNum == 0){ //如果请求记录为0,则触发所有请求完成的监听回调 $(document).trigger("allRequestComplate") } }});//发送第三个请求$.ajax({ url:"http://localhost/project/moduleThree/threeRequest", type:"GET", success:function(result){ allData.moduleThreeSuccessData = result; //将此请求的数据进行合并 }, error:function(error){ allData.moduleThreeError = error; }, complate:function(){ requestNum --; //此请求完成后,记录数减1 if(requestNum == 0){ //如果请求记录为0,则触发所有请求完成的监听回调 $(document).trigger("allRequestComplate") } }});
根据上面的示例代码,可以得出
请求耗时 = 最慢的那个请求时间
所有请求不会耗在等待上面,这样大大提高了请求效率。开发者需要做的事情只是把请求数据进行合并而已;其中使用事件系统进行回调,
是由于js是单线程,事件系统是异步的,不会阻塞主线程,当事件被触发时,主线程才会唤醒事件系统进行回调。
- 前端优化思路1-------“合并”ajax请求
- 前端性能优化--合并压缩js,减少http请求次数
- 合并ajax请求
- HTML前端ajax请求
- [前端] jquery ajax请求
- 前端-ajax请求常见问题
- 通过ajax异步向后端发送请求,响应请求向前端传送json格式数据的实现思路
- [前端优化]使用Combres合并对js、css文件的请求
- [前端优化]使用Combres合并对js、css文件的请求
- 前端小白--web前端ajax请求
- 前端性能优化一:合并css\javascript
- 表单前端验证+ajax异步请求
- spring boot+前端ajax请求通讯
- ajax请求后台时前端没有反应
- 【前端优化】nginx_concat_module模块实现静态资源合并
- Ajax(1):get请求
- 【前端开发】合并多个前端静态资源文件,减少HTTP请求次数
- 前端优化1--reflow
- MySQL——修改root密码的4种方法(以windows为例)
- 09:向量点积计算
- JS IF 作用域
- 第三周 项目1 顺序表的基本运算
- git 上传项目到分支
- 前端优化思路1-------“合并”ajax请求
- 微信开发追加报错
- jQuery——入门(一)JQuery的简介与基本选择器的使用
- string的入门研究
- [UVA]11021 Tribles
- kernel中的memtest
- Fragment防止自动清理 (ViewPager滑动时,滑出屏幕后被清理)(转)
- 静态
- idea部署踩坑: ibatis中配置文件载入错误org.xml.sax.SAXParseException: The string "--" is not permitted