目前的项目中有这样一个需求:
一个数据列表页面,需要先加载出基本信息,而实时的数据信息需要通过后台调用接口获取,而为了防止调用接口的并发数量过大,需要在js上控制每次异步请求的数据量,并且支持可自定义的并发量
这里给出一个思路
使用一个数组保存需要请求的数据信息
定义个并发量长度的状态标识位数组,其中初始化为0,数组中只有3种状态
0:无数据
1:存放数据、待发送
2:已发送
3种状态的变更为 0 -> 1 -> 2 - > 0
即页面加载时,初始化标志位为0,当程序判断标识位为0时,往队列中放一个数据,并置标志位为1,
当标志位为1时,发起异步请求,并在请求前,将标识位置为2,
当请求返回了数据之后,在请求的回调中,将标志位置为0,
这样就可以定义一个定时器,每隔一段时间调用请求的方法,并在方法中使用循环发起多个并发请求
代码如下:
//并发状态 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;
}
特此记录一下