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



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

var update;
(update = function() {
  $.get(source, function() {
    // Do something
    setTimeout(update, 5000);
  });
})();

在页面运行几个小时(Chromium 21)后,它可以轻松地OOM我的8GB RAM。由于客户端在非常小的配置(<1GB RAM)上使用IE6,因此问题更为重要。

我怎样才能避免这种怪癖?

好的

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

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

我实际上不会认为setTimeout会泄漏,但是有一个clearTimeout函数。只是出于研究目的,您可以尝试保存 setTimeout 的返回值并清除它,然后再开始下一个。

最新更新