¿Mantener una conexión jQuery .getJSON () abierta y esperando mientras está en el cuerpo de una página?

StackOverflow https://stackoverflow.com/questions/809434

Pregunta

Estoy escribiendo un sistema básico de mensajes push. Un pequeño cambio ha provocado que deje de funcionar correctamente. Dejame explicar. En mi versión original, pude poner el código en un documento como este:

<head>
  ...text/javascript">
  $(document).ready(function(){
    $(document).ajaxStop(check4Updates);
    check4Updates();
  });

  function check4Updates(){
    $.getJSON('%PATH%', callback);
  };
...
</head>

Esto funcionó muy bien y mantendría la conexión abierta incluso si el servidor devuelve nulo (lo que después de un tiempo de espera de 2 minutos). Simplemente seguiría llamando a la función getJSON una y otra vez indefinidamente. Feliz panda

Ahora, debo poner el segmento de código entre etiquetas. El acceso a la función $ (document) .ready () prácticamente no funcionará.

<body>
...
check4Updates();
$("body").ajaxStop(check4Updates);
...
</body>

Esto funciona ... por un tiempo. Poco después, dejará de llamar a check4Updates y entrará en un bucle infinito y usará el 100% del tiempo de procesador.

Estoy tratando de obtenerlo para que check4Updates se llame repetidamente hasta que se cierre la página. Si alguien tiene alguna idea de por qué mi simple cambio ya no funciona como se esperaba, POR FAVOR, hágamelo saber. Gracias por tomarse el tiempo de leer y ayudarme.

Saludos cordiales, Van Nguyen

¿Fue útil?

Solución

Sí, no querrás usar ese bucle, eres más o menos DOSing , sin mencionar el bloqueo del cliente.

Suficientemente simple, cree un complemento de sondeo:

Fuente: http://web.archive.org/web/20081227121015/http://buntin.org:80/2008/sep/23/jquery-polling-plugin/

Uso:

$("#chat").poll({
    url: "/chat/ajax/1/messages/",
    interval: 3000,
    type: "GET",
    success: function(data){
        $("#chat").append(data);
    }
});

El código para respaldarlo:

(function($) {
    $.fn.poll = function(options){
        var $this = $(this);
        // extend our default options with those provided
        var opts = $.extend({}, $.fn.poll.defaults, options);
        setInterval(update, opts.interval);

        // method used to update element html
        function update(){
            $.ajax({
                type: opts.type,
                url: opts.url,
                success: opts.success
            });
        };
    };

    // default options
    $.fn.poll.defaults = {
        type: "POST",
        url: ".",
        success: '',
        interval: 2000
    };
})(jQuery);

Otros consejos

Use un tiempo de espera, este tipo de bucles es una muy mala idea, así que si debe emplear encuestas por cualquier razón, asegúrese de no seguir golpeando su backend.

Debe cambiar a un método de sondeo como lo describe altCognito, o puede usar comet, que está diseñado para enviar datos del servidor al cliente. Dependiendo de sus necesidades, puede usar algo como Jetty (para Java) o Twisted (Python) o WebSync (ASP.NET/IIS)

¿Creo que esto se trata del servidor push?

¿Qué tal usar el Socket.IO?

Ref: Presentación de Socket IO 0.9, Google Group ( http://socket.io/ )

Ref: http: // techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery

Ref: Diversión con websockets, Node.js y jQuery ( http://nayna.org/blog /? p = 159 )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top