基于服务器端进程的AJAX进度条

时间:2013-06-20 16:13:16

标签: c# asp.net ajax loading

我最初的想法是创建一个会话变量,并在服务器端进程完成所有计算时更新它。例如,如果它完成了主要任务的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或某种类型)关于我正在进行的过程,这将非常有用。

1 个答案:

答案 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();

    }
}