Ich schreibe eine Webapp (Firefox-kompatibel nur), die lange Polling (über jQuery Ajax Fähigkeiten) verwendet, um mehr oder weniger konstante Updates vom Server an den Client zu senden. Ich mache mir Sorgen über die Auswirkungen, wenn ich das ganze für lange Zeit laufen lasse, sagen wir den ganzen Tag oder über Nacht. Der Basiscode Skelett ist dies:Verbesserung der Long-Polling Ajax Leistung
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);
}
(. Die halbe Sekunde „Schlaf“ ist so, dass der Client den Server nicht hämmern, wenn der Updates an den Client zurückkommen schnell - was sie sind in der Regel)
Nachdem es über Nacht laufen gelassen wurde, neigt es dazu, Firefox zu crawlen. Ich dachte, dass dies teilweise durch eine große Stapeltiefe verursacht werden könnte, da ich im Grunde eine unendlich rekursive Funktion geschrieben habe. Wenn ich jedoch Firebug verwende und einen Breakpoint in fetch
werfe, sieht das so aus. Der Stack, den Firebug mir zeigt, ist nur etwa 4 oder 5 Frames tief, selbst nach einer Stunde.
Eine der Lösungen, die ich betrachte, ändert meine rekursive Funktion in eine iterative, aber ich kann nicht herausfinden, wie ich die Verzögerung zwischen Ajax Anfragen ohne Spinning einfügen würde. Ich habe mir die JS 1.7 "yield" keyword angesehen, aber ich kann meinen Kopf nicht ganz umschließen, um herauszufinden, ob es das ist, was ich hier brauche.
Ist die beste Lösung, nur um eine harte Aktualisierung auf der Seite regelmäßig, sagen wir, einmal pro Stunde zu tun? Gibt es ein besseres/schlankeres Designdesign mit langen Pollings, das selbst nach 8 oder 12 Stunden keine Probleme mit dem Browser verursacht? Oder sollte ich das lange Polling einfach überspringen und ein anderes "constant update" -Muster verwenden, da ich normalerweise weiß, wie oft der Server eine Antwort für mich hat?
Das hilft mir !! – JulienFr