【问题标题】:What is the correct way to do an infinite loop that calls a method in Jquery or Javascript?执行在 Jquery 或 Javascript 中调用方法的无限循环的正确方法是什么?
【发布时间】:2012-06-15 11:24:07
【问题描述】:

我想每隔几秒就不停地更新一个页面。

为此,我写了以下内容:

var to;
$(function () {
           to = setTimeout(updateDivContent, 2000);
});

function updateDivContent() {

    $('#topbox').load('/home/blabla', null);


    $('#leftgraph').load('/home/blabla', null, function () {

        to = setTimeout(updateDivContent, 2000);
    });
};

这行得通,但是,它导致我认为是内存泄漏,因为大约 15 分钟后,计算机几乎死机,浏览器占用了所有可用内存和 CPU。

我猜超时基本上是堆叠,但是,我不知道如何解决这个问题。我已经尝试摆脱第二个超时并将第一个超时放入 while(true) 循环中,但是我无法让它工作。

谁能给点建议?

【问题讨论】:

  • 你已经在做的事情对我来说看起来不错 - 你肯定想要while(true)或类似的。如果您接听 Ajax .load() 呼叫,它还会崩溃吗? (我知道你显然需要它们,但只是为了测试目的......)
  • 您是否尝试在设置新超时之前使用clearTimeout 清除超时?
  • @WickyNilliams - 没有什么需要明确的:在新的设置之前,前一个已经执行。
  • 然后忽略我 :) 我想我把 setTimeout/clearTimeoutsetInterval/clearInterval 混淆了

标签: javascript jquery loops


【解决方案1】:

这实际上看起来不错。但是如果第一次 Ajax 调用没有在两秒内完成,它会堆叠,这可能(不确定)会导致问题。

超时本身不会叠加,因为您只有在前一个完成后才启动一个新的。

两个 Ajax 请求都完成后尝试启动新的超时:

$.when($('#topbox').load('/home/blabla'),
       $('#leftgraph').load('/home/blabla')
).then(function () {
    setTimeout(updateDivContent, 2000);
});

参考:$.when

【讨论】:

  • 据我所知,Ajax 应该完成了,它正在脱离局域网并且通常是即时的......如果你有兴趣......这就是正在发生的事情 - @987654322 @ ...我会尝试您的更改....我只是对 .load 感到好奇-它会完全替换/摆脱它正在替换的项目吗? “blabla”是一个高图表,我想知道它是被处理/卸载还是留在内存中/类似......我能想到的唯一结论。
  • 好吧,您没有提供有关上下文或您加载的页面内容的任何信息;) 但是,如果 /home/blabla 是创建全局变量的 JavaScript,那么这些将继续存在, 直到它们被覆盖或删除。我认为这里很难给出任何合适的建议,这需要对代码进行更详细的分析。
  • 别担心,已经 +1 了!我会拿出图表的更新,看看会发生什么。
  • 如果没有帮助,则无需投票;)也许您的问题无法通过 SO 解决。
  • @wil 你考虑过用 chrome 做一些 javascript 分析吗?
【解决方案2】:

我认为最好使用setInterval 而不是setTimeOut

this post

【讨论】:

  • 通常我会同意,但这里也有一个异步 HTTP 请求,它可能需要比您返回响应的间隔更长的时间。
  • setInterval 更糟糕,因为 Ajax .load() 函数的时间是可变的。最好在.load() 的完整回调中使用setTimeout,如图所示。
  • 那么在AJAX请求的OnComplete-event中进行下一次调用不是更好吗?
【解决方案3】:

您可能想调用clearTimeout 使之前的计时器无效,如下所示:

clearTimeout(to);
to = setTimeout(updateDivContent, 2000);

【讨论】:

  • 我认为没有必要,to 在每次setTimeout-Call 时都会被覆盖。
  • 在已经发生的超时时调用clearTimeout() 无效。
【解决方案4】:

你能这样吗,它会每 2 秒调用一次

to = setInterval("updateDivContent", 2000);


function updateDivContent() {

$('#topbox').load('/home/blabla', null);


$('#leftgraph').load('/home/blabla', null, function () {

    //to = setTimeout(updateDivContent, 2000); 
});
};

【讨论】:

  • setInterval 更糟糕,因为 Ajax .load() 函数的时间是可变的。最好在.load() 的完整回调中使用setTimeout,如图所示。
【解决方案5】:

试试setInterval:

var to;

$(function () {
    to = setInterval(updateDivContent, 2000);
});

function updateDivContent() {
    $('#topbox').load('/home/blabla', null);
    $('#leftgraph').load('/home/blabla')
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2016-02-14
    相关资源
    最近更新 更多