js控制异步请求数量 标签: js异步并发
2016-12-06 15:55
579 查看
目前的项目中有这样一个需求:
一个数据列表页面,需要先加载出基本信息,而实时的数据信息需要通过后台调用接口获取,而为了防止调用接口的并发数量过大,需要在js上控制每次异步请求的数据量,并且支持可自定义的并发量
这里给出一个思路
使用一个数组保存需要请求的数据信息
定义个并发量长度的状态标识位数组,其中初始化为0,数组中只有3种状态
0:无数据
1:存放数据、待发送
2:已发送
3种状态的变更为 0 -> 1 -> 2 - > 0
即页面加载时,初始化标志位为0,当程序判断标识位为0时,往队列中放一个数据,并置标志位为1,
当标志位为1时,发起异步请求,并在请求前,将标识位置为2,
当请求返回了数据之后,在请求的回调中,将标志位置为0,
这样就可以定义一个定时器,每隔一段时间调用请求的方法,并在方法中使用循环发起多个并发请求
代码如下:
来自CODE的代码片
一个数据列表页面,需要先加载出基本信息,而实时的数据信息需要通过后台调用接口获取,而为了防止调用接口的并发数量过大,需要在js上控制每次异步请求的数据量,并且支持可自定义的并发量
这里给出一个思路
使用一个数组保存需要请求的数据信息
定义个并发量长度的状态标识位数组,其中初始化为0,数组中只有3种状态
0:无数据
1:存放数据、待发送
2:已发送
3种状态的变更为 0 -> 1 -> 2 - > 0
即页面加载时,初始化标志位为0,当程序判断标识位为0时,往队列中放一个数据,并置标志位为1,
当标志位为1时,发起异步请求,并在请求前,将标识位置为2,
当请求返回了数据之后,在请求的回调中,将标志位置为0,
这样就可以定义一个定时器,每隔一段时间调用请求的方法,并在方法中使用循环发起多个并发请求
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | //并发状态 0:未发送 1:待发送 2:正在发送var asycStatus = new Array();//全局su测点数组var g_suDataMap = new Array();//当前查询条件下的su测点数组var suDataMap = new Array();//定时器var intv ; /** * 根据并发数,初始化标志位数组,默认都为0 * @returns */function initAsycStatus(){ var iAsyc = parseInt(iAsycNum); asycStatus = []; for(var i = 0; i < iAsyc; i++) { asycStatus.push(0); }}/** * 调用B接口获取测点的实时数据 * @returns */function getTPData(suInfo){// suDataMap.push("AB-R4-D3-C3-2D-D1");// suDataMap.push("A6-R4-A2-C3-2X-D2");// suDataMap.push("AB-R4-D9-E3-21-D3");// suDataMap.push("D3-14-D3-C3-2D-D4");// suDataMap.push("AB-R4-13-C3-2D-35");// suDataMap.push("AC-30-21-31-XE-36");// suDataMap.push("00-30-21-31-vE-97"); for(var i = 0 ; i < g_suDataMap.length ; i ++) { suDataMap.push(g_suDataMap[i]); } //调取b接口获取su测点数据 intv = setInterval("getSuTpData()", parseInt(iAsycTime));} /** * 异步请求B接口 * @param index * @param intervalName * @returns */function getSuTpData(){ window.clearInterval(intv); //清除定时器// console.log("定时器启动 "); var iAsyc = parseInt(iAsycNum); for(var i = 0 ; i < iAsyc ; i ++) { if(asycStatus[i] == 0) { //如果该状态为0 未发送,则进入下面请求 //装载数据 var param = addData(i); if(param == null) { //返回的参数为空,则不执行 return; } if(asycStatus[i] == 1) { //调用B接口 getSuData(i, param); } } } intv = setInterval("getSuTpData()", parseInt(iAsycTime)); //重新绑定定时器} //加su数据function addData(index){ var param = {}; param.SU = suDataMap.shift(); if(param.SU == undefined) {//如果取出来的数据为undefined,则直接返回null; return null; } asycStatus[index] = 1; //将标志位置为 1 待发送 并在下面进行数据的组装 param.sleepTime = index * 10000; param.index = index; return param;} |
来自CODE的代码片
相关文章推荐
- JS异步流程控制(序列模式、并发模式、有限并发模式)
- Node.js与Golang使用感受与小结【三】--JS异步流程控制(序列模式、并发模式、有限并发模式)
- 控制服务器处理请求的数量(高并发)-防止用户重复点击导致多次请求
- 用JS简单地控制HTML中 img 标签 的 max-width 的办法
- 用js控制a标签href属性并实现跳转
- WCF 第五章 控制并发会话的数量
- WCF 第五章 控制并发实例的数量
- 用js控制a标签href属性并实现跳转
- 实现对现有的aspx请求进行异步队列控制处理
- 异步请求之同域名异步文件上传iframe标签
- 如何让中间层MIDAS/DATASNAP支持大量的并发用户并且控制连接数量
- 异步请求数据和Js分页控件结合使用心得
- 并发请求解决Form的异步提交
- script标签属性之:剖析async(异步加载js)
- 如何让中间层MIDAS/DATASNAP支持大量的并发用户并且控制连接数量
- JS异步请求数据
- IE6,IE7 关于js动态调整img src属性,无法正确发出异步请求的问题
- 老外就是牛叉01-用js控制所有A标签的打开窗口状态----------guoyz_1
- WCF 第五章 控制并发会话的数量
- 使用JS和Ajax发出异步请求