还有一个javascript clearInterval不起作用

还有一个javascript clearInterval不起作用,javascript,setinterval,clearinterval,Javascript,Setinterval,Clearinterval,我看过很多这样的帖子,也看过其中的一些,但到目前为止似乎没有任何帮助。因此,我试图在ajax调用发生时连续调用计时器。一旦ajax调用到达完成事件,我想清除计时器的间隔,但这似乎不起作用,因为对CheckProgress()的调用一直在进行 这是我的密码: var timer = ""; $("#ChartUpdateData").click(function () { $("#loadingimgfeatdiv").show(); //ajax loa

我看过很多这样的帖子,也看过其中的一些,但到目前为止似乎没有任何帮助。因此,我试图在ajax调用发生时连续调用计时器。一旦ajax调用到达完成事件,我想清除计时器的间隔,但这似乎不起作用,因为对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);
    }
编辑:
您的代码很好。这是一本书。它在谷歌Chrome和Firefox上运行,正如您所期望的那样。您能确认此代码段在您的计算机上不工作吗

我做了一些微小的改变:

  • AJAX调用
    /echo/json
  • 较小的间隔(50毫秒)
  • 函数引用:
    setInterval(CheckProgress,5000)
    而不是带有JavaScript的字符串
Interval函数被调用几次,并在AJAX调用返回时被清除一次。这正是你想要的


你能重现那里的问题吗?

你的代码很好。这是一本书。它在谷歌Chrome和Firefox上运行,正如您所期望的那样。您能确认此代码段在您的计算机上不工作吗

我做了一些微小的改变:

  • AJAX调用
    /echo/json
  • 较小的间隔(50毫秒)
  • 函数引用:
    setInterval(CheckProgress,5000)
    而不是带有JavaScript的字符串
Interval函数被调用几次,并在AJAX调用返回时被清除一次。这正是你想要的


你能重现那里的问题吗?

我从来都不喜欢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);
}

我从来都不喜欢赛特威特。我喜欢直接管理计时器

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);
}

您确定调用过
complete
函数吗?这可能只是AJAX请求的一个问题,与
setInterval()
无关。100%确定其工作正常。我可以看到console.log(“结束进度检查…”);正在处理中。我添加了一个firebug的图像来帮助显示正在发生的事情。我认为你把事情复杂化了。既然可以处理$.ajax提供的所有事件,那么首先为什么需要这些计时器?
setInterval(CheckProgress,5000)
是正确的声明。传递字符串是不推荐使用的表单。另外,请确保您多次单击,否则您将丢失对原始计时器的引用。@zzbov您能否详细说明一下单击多次的含义?我不是,但我认为计时器是全局性的:(所以我认为无论你说什么都可能是问题所在。你确定你的
complete
函数被调用过吗?这可能只是你的AJAX请求有问题,与
setInterval()
无关。100%确定它在工作。我可以看到console.log(正在处理“正在结束进度检查…”。我添加了firebug的图像以帮助显示正在进行的操作。我认为您的操作过于复杂。既然您可以处理$.ajax提供的所有事件,为什么首先需要这些计时器?
setInterval(CheckProgress,5000)
是正确的声明。传递字符串是不推荐使用的形式。此外,请确保您多次单击,否则您将丢失对原始计时器的引用。@zzzzBov能否详细说明一下单击多次的含义?我不是,但我认为计时器是全局的:(所以我认为无论你在说什么都可能是问题所在。不,我无法在JSFIDLE中重现问题。它的工作原理与我的预期一致:(你认为我在MVC3应用程序中工作的事实与它为什么不工作有关吗?不,我无法在JSFIDLE中重现问题。它的工作原理与我的预期一致:(你认为我在MVC3应用程序中工作这一事实与它为什么不工作有关吗?至少使用
window.setTimeout(CheckProgress,5000)
正如我们都理解和喜欢这里的一样,这很好!但我仍然想弄清楚为什么setInterval没有按它“应该”的方式工作。如果没有其他东西发布,我会在几个小时内接受。这是我第二次陷入
setInterval()
陷阱。谢谢!!至少使用
window.setTimeout(CheckProgress,5000);
正如我们都逐渐理解和喜爱的那样,这非常有效!但我仍然想弄清楚为什么setInterval不能“正常”工作。如果没有其他消息发布,我会在几个小时内接受。这是我第二次落入
setInterval()
陷阱。谢谢!!