Manter um aberto conexão jQuery .getJSON () e espera, enquanto no corpo de uma página?
-
03-07-2019 - |
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
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 )