我正在处理一个仪表板项目,其中需要每 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 的返回值并清除它,然后再开始下一个。