当前台传入后台数据量过大,可以将前台数据分批次传入后台,使用redis缓存起来,等待所有数据传入完成后,后台开启线程进行处理。
注意:
1、注意当前是第几组数据
2、是否为最后一组数据
3、redis插入时保证始终从一端插入(右插)
var count = 0; //当前是第几组
var threadCount=0;//当前线程的数量
/**
*
* @param showStr 遮罩层提示语
* @param bpcthreadCount 最大线程限制数
* @param singleThreadDataCount 每个线程的最大数据
* @param datas 保存数据
* @param dataFunc 保存前数据处理的方法名
*/
function theardMain(showStr,bpcthreadCount,singleThreadDataCount,datas,dataFunc) {
var key =("fb_"+guid());
coverShow(showStr);
count = 0;
threadCount=0;
var pos=0,totalSize=datas.length-1;
doThreadCheckDown(datas,pos,totalSize,bpcthreadCount,singleThreadDataCount,key,dataFunc);
$('.coverpro').show();
$('.converprobar').css('width','0%');
$('.coverpronum').html('0%');
pollingReply(key,singleThreadDataCount);
}
/**
* 多线程的启动轮询方法
* @param datas 多线程执行的数据
* @param pos 当前数据的长度
* @param totalSize 数据最大的长度
* @param bpcthreadCount 当前线程的数量
* @param singleThreadDataCount 每个线程需要的数据长度
* @param key 当前线程执行时redis的ke值
* @param url url
* @param isDocheckdown 是下达/批复还是撤销下达/撤销批复
* @param urltype url的类型
*/
function doThreadCheckDown(datas,pos,totalSize,bpcthreadCount,singleThreadDataCount,key,dataFunc){ //线程方法
if(pos>totalSize){//当前数据长度大于最大数据长度,说明执行成功
return;
}
if(threadCount<=bpcthreadCount){//限制线程数量
var endPos = pos+singleThreadDataCount;
var subData = datas.slice(pos,endPos); //当前的数据
var isEnd =false;
if(endPos>=totalSize){
isEnd = true;
}
pos=endPos;
threadCount++; //线程数量增加1
doSubCheckDown(subData,key,totalSize+1,isEnd,bpcthreadCount,dataFunc);
}
setTimeout(function(){
doThreadCheckDown(datas,pos,totalSize,bpcthreadCount,singleThreadDataCount,key,dataFunc);
},100);
}
/**
* 多线程执行的后台方法
* @param subData 当前的数据
* @param key 当前线程执行时redis的ke值
* @param sumNum 最大的数据长度
* @param url url
* @param isDocheckdown 是下达/批复还是撤销下达/撤销批复
* @param urltype url的类型
*/
function doSubCheckDown(subData,key,sumNum,isEnd,threadCountCount,dataFunc){
count++;
var param={subData:subData,isEnd:isEnd,count:count,sumNum:sumNum,threadCountCount:threadCountCount,key:key};
var func = window[dataFunc];
var data = func.apply(this,[param]);
doCommonAsyncServereCall(bosspageconfig.bosspagebean, "theardMain", data,
function(result) {
threadCount--;//线程结束,减1
}, function(result) {
threadCount--;//线程结束,减1
}, false, "正在保存中.......");
}
/**
* 轮询后台接口,查询当前进度,是否完成
* @param key 当前执行时redis的ke值
* @param singleThreadDataCount 每个线程执行的数据长度
*/
function pollingReply(key,singleThreadDataCount) {
doCommonAsyncServereCall(bosspageconfig.bosspagebean, "/pollingReply", {"key":key,"num":singleThreadDataCount},
function(result) {
if(result&&result.result&&result.result==true){//执行成功
coverHide();
if(result.failMsg){
toastr.warning(result.failMsg);
}else {
toastr.success(result.msg);
}
dorefresh()
$('.coverpro').hide();
$('.converprobar').css('width',0);
$('.coverpronum').html('');
return;
}else {//执行过程中。。。
$('.coverpro').show();
setTimeout(function() {
pollingReply(key,singleThreadDataCount);
$('.converprobar').css('width',result.schedule+'%');
$('.coverpronum').html(result.schedule+'%');
}, 4000);
}
}, function(result) {
coverHide();
toastr.error(result.msg);
});
}