您的位置:首页 > Web前端 > JavaScript

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,

这样就可以定义一个定时器,每隔一段时间调用请求的方法,并在方法中使用循环发起多个并发请求

代码如下:

  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的代码片
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: