0

我需要能够每秒调用一个函数“getProgress”。此函数执行 ajax 请求并更新进度条。当从 ajax 返回的调用为“true”时,我需要能够停止对该函数的调用。

html:

<td class="checkbox">
<input type="checkbox" value="6" class="checkbox download" id="chk-6">
<div class="hide" id="prgbar-6"><span class="progresslabel"></span></div>
</td>

我的功能:

function getProgress(operationId) { // receives operationId
    $.post("@Url.Action("Status","Packages")", { operationId: operationId }, function (data) {
        if (data) {
            for (var key in data) {
                if ($("#prgbar-" + key + "").size() != 0) {
                    var objPrg = $("#prgbar-" + key + "");
                    var objchk = $("#chk-" + key + "");
                    if (data[key]) {
                        objPrg.find("span").text("downloading...").css("color:#000000");
                        objchk.hide();
                        objPrg.removeClass("hide").show().progressbar({
                            value: 0
                        });
                        var value = Math.floor(parseInt(data[key]) * 100);
                        objPrg.progressbar("option", "value", value);
                        objPrg.find("span").text(value + "%");
                    } else {

                    }
                }
            }
        }
    });
}
4

3 回答 3

1
var interval = setInterval(function(){getProgress(operationId,interval)},1000);

在你的 $.POST 完成回调函数中,清除这个间隔:{我在这里使用完成,但如果你只想为成功的请求做,使用 .success()}

$.post("@Url.Action("Status","Packages")", { operationId: operationId }, function (data) {
        if (data) {
            for (var key in data) {
                if ($("#prgbar-" + key + "").size() != 0) {
                    var objPrg = $("#prgbar-" + key + "");
                    var objchk = $("#chk-" + key + "");
                    if (data[key]) {
                        objPrg.find("span").text("downloading...").css("color:#000000");
                        objchk.hide();
                        objPrg.removeClass("hide").show().progressbar({
                            value: 0
                        });
                        var value = Math.floor(parseInt(data[key]) * 100);
                        objPrg.progressbar("option", "value", value);
                        objPrg.find("span").text(value + "%");
                    } else {

                    }
                }
            }
        }
    }).complete(function() { clearInterval(interval); });
于 2012-11-07T10:28:32.530 回答
1

我喜欢这种方法。它不需要清除间隔。它只是自行运行并在必要时设置超时。

var operationId = ...;
var processFunction = function () {
        $.post("@Url.Action("Status","Packages")", { operationId: operationId }, function (data) {
            if (data !== true) {
                // your normal function stuff
                setTimeout(processFunction, 1000);
            }
        });
    };

setTimeout(processFunction, 1000);
于 2012-11-07T10:36:48.707 回答
0

方法#1:

您可以在名为 requestRunning 的函数之外创建一个变量,并在调用 getProgress 时检查 requestRunning 是否为真。

// Pseudo-code
var requestRunning = false;
if requestRunning === true  => continue with getProgress
if requestRunning === false => stop firing getProgress

方法#2:

使用 setInterval 并在请求成功时清除间隔。

var progressHandle = setInterval(function(){getProgress(id)}, 1000);

$.ajax({
  success: function() {
    clearInterval(progressHandle);
  }
});

我可能更喜欢第一个选项,尽管通过随后的 AJAX 调用检查进度并不是很好。

于 2012-11-07T10:27:31.897 回答