js控制异步请求数量

目前的项目中有这样一个需求:

一个数据列表页面,需要先加载出基本信息,而实时的数据信息需要通过后台调用接口获取,而为了防止调用接口的并发数量过大,需要在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;
}

特此记录一下


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值