И еще один javascript clearInterval не работает - PullRequest
1 голос
/ 26 сентября 2011

Я видел кучу этих нитей и просмотрел некоторые из них, но пока ничего не помогало. Поэтому я пытаюсь вызывать таймер непрерывно, пока идет вызов ajax. Как только ajax-вызов достигает завершенного события, я бы хотел очистить Interval таймер, но это, похоже, не работает, потому что вызов 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);
    }

EDIT: enter image description here

Ответы [ 2 ]

4 голосов
/ 26 сентября 2011

Мне никогда не нравился 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);
}
1 голос
/ 26 сентября 2011

Ваш код в порядке. Вот скрипка . Он работает в Google Chrome и Firefox так же, как вы ожидали. Можете ли вы подтвердить, что этот фрагмент не работает на вашем компьютере?

Я сделал несколько крошечных изменений:

  • AJAX вызов /echo/json
  • Меньший интервал (50 мс)
  • ссылка на функцию: setInterval(CheckProgress, 5000) вместо строки с JavaScript

Функция интервала вызывается несколько раз и сбрасывается один раз echo Служба AJAX возвращает вызов. Точно так, как вы хотите, чтобы это было.

Можете ли вы воспроизвести проблему там?

...