Estoy escribiendo una aplicación web (compatible con Firefox solo) que utiliza un sondeo largo (a través de las capacidades ajax de jQuery) para enviar actualizaciones más o menos constantes del servidor al cliente. Me preocupan los efectos de dejarlo funcionando durante largos períodos de tiempo, por ejemplo, todo el día o toda la noche. El esqueleto de código básica es la siguiente:Mejorando el rendimiento de Ajax de sondeo largo
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);
}
(. El medio segundo "sueño" es para que el cliente no clavar el servidor si los cambios están llegando de nuevo al cliente de forma rápida - que por lo general son)
Después de dejarlo funcionando durante la noche, tiende a hacer que Firefox se arrastre. He estado pensando que esto podría ser causado parcialmente por una gran profundidad de la pila ya que básicamente he escrito una función infinitamente recursiva. Sin embargo, si uso Firebug y lanzo un punto de interrupción en fetch
, parece que este no es el caso. La pila que Firebug me muestra tiene solo 4 o 5 cuadros de profundidad, incluso después de una hora.
Una de las soluciones que estoy considerando es cambiar mi función recursiva a una iterativa, pero no puedo entender cómo insertaría la demora entre las solicitudes Ajax sin girar. Miré el JS 1.7 "yield" keyword pero no puedo entenderlo, para ver si es lo que necesito aquí.
¿Es la mejor solución solo hacer una actualización en la página periódicamente, por ejemplo, una vez cada hora? ¿Hay un patrón de diseño de encuesta larga mejor/más delgado que no perjudique al navegador incluso después de funcionar durante 8 o 12 horas? ¿O debería omitir el largo sondeo y utilizar un patrón diferente de "actualización constante" ya que normalmente sé con qué frecuencia el servidor tendrá una respuesta para mí?
¡Eso me ayuda! – JulienFr