Javascript “;递归”;AJAX回调中的超时会填满内存。我怎样才能避免这种情况?

Javascript “;递归”;AJAX回调中的超时会填满内存。我怎样才能避免这种情况?,javascript,memory-leaks,settimeout,Javascript,Memory Leaks,Settimeout,我正在从事一个仪表板项目,其中需要每隔5秒左右通过AJAX源更新多个小部件(比如十几个)。我目前正在使用setTimeout对小部件更新进行排队,每次小部件实际更新时(从技术上讲不是递归,而是…)都会调用该更新。这就是代码的外观 var update; (update = function() { $.get(source, function() { // Do something setTimeout(update, 5000); }); })(); 在页面运行几个小

我正在从事一个仪表板项目,其中需要每隔5秒左右通过AJAX源更新多个小部件(比如十几个)。我目前正在使用
setTimeout
对小部件更新进行排队,每次小部件实际更新时(从技术上讲不是递归,而是…)都会调用该更新。这就是代码的外观

var update;
(update = function() {
  $.get(source, function() {
    // Do something
    setTimeout(update, 5000);
  });
})();
在页面运行几个小时后(Chromium 21),它可以轻松地打开我的8GB内存。 由于客户端在非常小的配置(小于1GB的RAM)上使用IE6,所以这个问题更为重要


如何避免这种怪癖?

使用setInterval。这样,您只需生成一个计时器,而不需要每五秒钟启动一个新的计时器,这可能会消耗浏览器中的某种句柄


实际上,我没有想到setTimeout会泄漏,但是有一个clearTimeout函数。出于研究目的,您可以尝试保存setTimeout的返回值并将其清除,然后再开始下一个设置。

好的,感谢freakish&Pointy,泄漏确实是由jqPlot造成的。问题是,您必须在所述绘图上使用
.destroy()
方法,然后删除(而不是清空)其DOM容器,然后再创建另一个DOM容器并重新绘制绘图。

IE6?这是一个“内存泄漏浏览器”,你知道吗?:)它泄漏的原因可能有上千个原因。但我认为有一件事是正确的:它与定期更新本身无关。是
//做点什么
泄露内存的东西。IE6大约有11年历史了。这是你的问题。同意这里的“怪物”。到底什么是“某物”?我也经历了这些铬泄漏,这就是为什么我感到震惊。
//Do something
只是一个jqplot图的创建,其中包含更新的数据。我会调查的@Iso这要么意味着jqplot泄漏内存(我从来没有听说过该库),要么是您错误地更新了数据。向我们展示您的代码,我们将看一看。
setInterval
在这里不是一个选项,因为AJAX请求可能需要5秒钟以上才能完成,我不希望HTTP请求排队。使用
setTimeout
可以确保更新连续运行,即使它们之间的间隔不是5秒(这在我的项目中不是问题)。