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

2
Van Nguyen 1 may. 2009 a las 02:29

4 respuestas

La mejor respuesta

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

Bastante simple, crea un plugin 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);
6
Adam Lindsay 3 jun. 2017 a las 18:22

Use un tiempo de espera, este tipo de bucles es una muy mala idea, por lo que si debe emplear el sondeo por cualquier motivo, asegúrese de no seguir golpeando su backend.

0
Evert 30 abr. 2009 a las 22:39

Creo que se trata de empujar el servidor?

¿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)

0
Yoichi 14 ene. 2013 a las 03:28

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

0
jvenema 10 ene. 2010 a las 16:42