私は、サーバーからクライアントに多かれ少なかれ一定の更新を送信するために(jQueryのajax機能を介して)長いポーリングを使用するWebアプリ( Firefox互換のみ)を書いています。これを長時間、たとえば1日中または一晩実行したままにしておくことの影響が心配です。基本的なコードスケルトンは次のとおりです。
function processResults(xml)
{
// do stuff with the xml from the server
}
function fetch()
{
setTimeout(function ()
{
$.ajax({
type: 'GET',
url: 'foo/bar/baz',
dataType: 'xml',
success: function (xml)
{
processResults(xml);
fetch();
},
error: function (xhr, type, exception)
{
if (xhr.status === 0)
{
console.log('XMLHttpRequest cancelled');
}
else
{
console.debug(xhr);
fetch();
}
}
});
}, 500);
}
(0.5秒間の「スリープ」とは、更新がクライアントにすぐに返される場合に、クライアントがサーバーを攻撃しないようにするためです。通常はそうです。)
これを一晩実行したままにすると、Firefoxがクロールする傾向があります。基本的に無限再帰関数を作成したので、これはスタックの深さが大きいことが原因の一部である可能性があると考えていました。ただし、Firebugを使用してブレークポイントをにスローするとfetch
、そうではないように見えます。Firebugが表示するスタックは、1時間後でも、約4または5フレームの深さしかありません。
私が検討している解決策の1つは、再帰関数を反復関数に変更することですが、スピンせずにAjaxリクエストの間に遅延を挿入する方法がわかりません。JS 1.7の「yield」キーワードを見てきましたが、ここで必要なものかどうかを判断するために、頭を完全に包むことはできません。
ページを定期的に、たとえば1時間に1回ハードリフレッシュするのが最善の解決策ですか?8時間または12時間実行した後でも、ブラウザに害を及ぼさない、より優れた/よりスリムなロングポーリングデザインパターンはありますか?または、サーバーが応答する頻度を通常知っているので、長いポーリングを完全にスキップして、別の「一定の更新」パターンを使用する必要がありますか?