我最初的想法是创建一个会话变量,并在服务器端进程完成所有计算时更新它。例如,如果它完成了主要任务的1/10,则将会话变量更新为10%...同时我有第二个AJAX请求继续检查此Session变量,直到服务器端处理完成为止。但是我现在正在阅读,在我的服务器端处理页面完成之前,Session变量不可用。
我还注意到,使用这种方法,我的第二个aspx将在服务器端处理完成后加载,这是无用的,因为在处理完成之前它不会提供任何加载信息。
现在我有一个动画加载图标,但我需要某种指示器来确定服务器的步骤。
当前设置
function getComparison(result) {
//grabs content from comparisons.aspx to show results
$("#differenceSummary").html(result);
//hide loading overlay image
$("#loading").removeClass("visible");
}
基本上我只是将comparisons.aspx的内容转储到div中。我查看了UpdatePanel服务器控件,但这些示例似乎并没有使它在这种情况下看起来很有用。他们都使用按钮,我需要实时提供正在进行的操作。
如果我可以向客户返回任何(希望是1-100或某种类型)关于我正在进行的过程,这将非常有用。
答案 0 :(得分:2)
对于那些想知道我最终如何做到这一点的人,我最终做了几个AJAX请求。
我的第一个AJAX请求确定了需要进行多少请求(我有700,000个DB记录,我一次做了30,000个)并设置了加载栏。一旦设置了加载栏,我就会点击相同的ASPX文件“X”次,对于每次调用,我都会更新进度条(需要一些数学运算)。一旦进度条达到100%,我会执行另一个AJAX请求以从服务器端处理中获取结果。
我的初始代码调用了comparison.aspx,并将其附加到div。
$.ajax({
url: "comparisons.aspx",
type: "GET",
success: getComparison,
error: showErrors
});
//On Success, show results
function getComparison(result) {
//grabs content from comparisons.aspx to show results
$("#differenceSummary").html(result);
}
当comparisons.aspx首次加载时,它会加载一个空的进度条,并根据我上传的文件生成信息(这是我的应用程序特有的)。加载此页面时,AJAX请求的数量将放在javascript中。
//how many records to check at a time
var numOfRecordsAtATime = 30000;
//number of original/modified records
var origNumOfRecords = parseInt($("#origNumOfRecords").text());
var modNumOfRecords = parseInt($("#modNumOfRecords").text());
var highestNum;
//arithmetic to see how many AJAX calls are necessary
if (origNumOfRecords > modNumOfRecords) {
highestNum = origNumOfRecords;
} else {
highestNum = modNumOfRecords;
}
var numberofCallsToMake = parseInt(Math.floor(highestNum / numOfRecordsAtATime)) + 1;
//How much the progress meter should increase at a time
var increments = (100 / numberofCallsToMake);
//number of records in total we've completed
var numRecordsCompleted = 0;
//number of times we've incremented
var numIncrementsCompleted = 0;
function startAjax() {
$("#progressbar").progressbar({
value: 1
});
if (!halt) {
while (true) {
if (numRecordsCompleted < origNumOfRecords) {
$.ajax({
url: "ajaxCall.aspx?randNo=" + Math.random(),
type: "GET",
success: doAjaxCall,
error: showTheError
});
numRecordsCompleted = numRecordsCompleted + numOfRecordsAtATime;
} else {
break;
}
}
}
}
function doAjaxCall(result) {
numIncrementsCompleted++;
console.log(result);
var progress = (parseInt(numIncrementsCompleted * increments));
$("#progressbar").progressbar({
value: progress
});
console.log(progress);
if (progress == 100) {
getResults();
}
}