Pergunta

Eu estou escrevendo um sistema básico de mensagens empurrão. Uma pequena mudança fez com que ele pare de workingly corretamente. Deixe-me explicar. Na minha versão original, eu era capaz de colocar o código no de um documento algo como isto:

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

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

Isso funcionou bem e iria manter a conexão aberta, mesmo se o nulo retorno servidor (que seria depois dizer um tempo limite 2 minutos). Seria apenas continuar chamando a função getJSON repetidas indefinidamente. Panda feliz.

Agora, devo colocar o segmento de código entre tags. O acesso ao $ (document) .ready () função praticamente não vai funcionar.

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

Este funciona ... por um tempo. Pouco tempo depois, ele vai parar de chamar check4Updates e entrar em um loop infinito e usar 100% de tempo do processador.

Eu estou tentando fazê-lo para que check4Updates é repetidamente chamado até que a página é fechada. Se alguém tiver qualquer insights a respeito de porque o meu simples mudança não está mais funcionando como esperado, por favor me avise. Obrigado por tomar o tempo para ler e me ajudar.

Atenciosamente, Van Nguyen

Foi útil?

Solução

Sim, você não vai querer usar esse loop, você está muito bem dosagem si mesmo para não mencionar o bloqueio do cliente.

bastante simples, criar um plugin de pesquisa:

Fonte: 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);
    }
});

O código para apoiá-la:

(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);

Outras dicas

Use um tempo limite, estes tipos de loops são uma péssima idéia, então se você deve empregar votação por qualquer razão, certifique-se de não manter martelando seu backend.

Você quer necessidade de mudança para um método de votação como descrito por altCognito, ou você pode usar cometa, que é projetado para dados de pressão a partir do servidor para o cliente. Dependendo de suas necessidades, você pode usar algo como Jetty (para Java) ou trançado (Python) ou WebSync (ASP.NET/IIS)

Eu acho que se trata de servidor push?

Que tal usar o Socket.IO?

Ref: Apresentando soquete IO 0.9, Google Group ( http://socket.io/ )

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

Ref: Fun with websockets, Node.js e jQuery ( http://nayna.org/blog /? p = 159 )

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top