1

我已经看过一堆这些线程并经历了其中一些,但到目前为止似乎没有任何帮助。所以我试图在 ajax 调用发生时连续调用计时器。一旦 ajax 调用到达完成事件,我想 clearInterval 计时器,但这似乎不起作用,因为对 CheckProgress() 的调用一直在进行。

这是我的代码:

var timer = "";

        $("#ChartUpdateData").click(function () {
            $("#loadingimgfeatdiv").show(); //ajax loading gif
            if (timer == "")
            {
                console.log("Starting Progress Checks...");
                timer = window.setInterval("CheckProgress()", 5000);
            }

            $.ajax({
                type: "POST",
                async: true,
                url: '@(Url.Action("UpdateServerData","Charts"))',
                contentType: "application/json; charset=utf-8",
                success: function (data) {

                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {

                },
                complete:function (jqXHR, textStatus) {
                    $("#loadingimgfeatdiv").hide();
                    StopCheckingProgress();
                    LoadChart();
                },
            });

        });

    function StopCheckingProgress()
    {
        window.clearInterval(timer);
        timer = "";
        console.log("Ending Progress Checks...");
    }
    function CheckProgress()
    {
        console.log("Checking Progress...");
        console.log(timer);
    }

编辑: 在此处输入图像描述

4

2 回答 2

4

我从不喜欢 setInterval。我喜欢直接管理计时器。

var timerStop = false

$("#ChartUpdateData").click(function () {
    $("#loadingimgfeatdiv").show(); //ajax loading gif
    if (!timerStop) {
        console.log("Starting Progress Checks...");
        CheckProgress()
    }

    $.ajax({
        type: "POST",
        async: true,
        url: '@(Url.Action("UpdateServerData","Charts"))',
        contentType: "application/json; charset=utf-8",
        success: function (data) {

        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {

        },
        complete:function (jqXHR, textStatus) {
            $("#loadingimgfeatdiv").hide();
            timerStop = true;
        },
    });

});

function CheckProgress()  {
    if(timerStop) {
        console.log("Ending Progress Checks...");
        return;
    }
    console.log("Checking Progress...");
    console.log(timer);
    window.setTimeout(function(){CheckProgress()}, 5000);
}
于 2011-09-26T19:37:45.963 回答
1

你的代码很好。这是一个小提琴。正如您所料,它可以在 Google Chrome 和 Firefox 上运行。你能确认这个片段在你的机器上不起作用吗?

我做了一些微小的改变:

  • AJAX 调用/echo/json
  • 更小的间隔(50 毫秒)
  • 函数参考:setInterval(CheckProgress, 5000)用 JavaScript 代替字符串

间隔函数被调用几次,一旦echo服务 AJAX 调用返回就被清除。正是你想要的样子。

你能重现那里的问题吗?

于 2011-09-26T19:35:24.820 回答