0

私は、5 秒ごとに AJAX ソースを介して複数のウィジェット (ダースなど) を更新する必要があるダッシュボード プロジェクトに取り組んでいます。私は現在setTimeout、ウィジェットが実際に更新されるたびに呼び出されるウィジェットの更新をキューに入れるために使用しています(技術的には再帰ではありませんが…)。これは、コードがどのように見えるかです

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

ページを数時間実行した後 (Chromium 21)、8 GB RAM を簡単に OOM できます。クライアントは非常に小さな構成 (< 1GB RAM) で IE6 を使用するため、この問題はさらに重要です。

どうすればこの癖を回避できますか?

4

2 に答える 2

1

わかりました、気まぐれでPointyに感謝します、リークは確かにjqPlotによって引き起こされました。つまり、.destroy()別のプロットを作成してプロットを再描画する前に、そのプロットでメソッドを使用してから、そのDOMコンテナを削除する(空にしない)必要があります。

于 2012-09-18T09:39:16.693 に答える
0

代わりに setInterval を使用してください。そうすれば、タイマーを 1 つ生成するだけで、5 秒ごとに新しいタイマーを開始する必要がなくなります。これにより、ブラウザーで何らかのハンドルが消費される可能性があります。

私は実際に setTimeout がリークするとは思わなかったでしょうが、 clearTimeout 関数があります。調査目的のためだけに、次のものを開始する前に、setTimeout の戻り値を保存してクリアすることを試みることができます。

于 2012-09-17T13:05:56.250 に答える