AJAX polling de um URL retornando JSON não parece retornar respostas frescos (Método do jQuery $ .ajax ())
-
06-07-2019 - |
Pergunta
Meu projeto requer polling uma determinada URL para uma resposta JSON, usando AJAX. O primeiro pedido AJAX que faço alerta o servidor que eu quero algum conteúdo JSON, e ele começa a construir e cacheing uma resposta, enviando-me de volta { "status": "pendente"} para cada solicitação AJAX posterior até que o JSON está pronto. Nesse ponto, as mudanças de resposta para JSON que contém o conteúdo que eu possa analisar e exibir no documento, o que eu quero fazer, logo que o URL retorna algo diferente de { "status": "pendente"} .
Eu configurar uma função de pesquisa que funciona como esperado repetidamente solicitar JSON a partir do URL. No entanto, o problema é que ele continua a obter a resposta { "status": "pendente"} , mesmo quando eu navegação diretamente para o URL e pode ver que a resposta JSON completo está pronto e está sendo servido . Por alguma razão, minha função polling ainda recebe { "status": "pendente"}.
Quando eu atualizar a página que contém o código de votação, que geralmente funciona no primeiro pedido - ou seja, ele recebe a resposta JSON completo. Que me leva a crer que é algum tipo de cache problema, mas eu não tenho certeza de onde ou por quê. cada pedido de AJAX não deve obter uma resposta fresco, ou isso é algo que eu posso configurar no meu $. ajax () chamada?
Aqui está o código que estou usando agora:
function ajax_poll() {
$.ajax({
url: JSON_URL, // JSON_URL is a string containing the URL to poll
dataType: 'json',
error: function(xhr_data) {
display_error();
},
success: function(xhr_data) {
if (xhr_data.status == 'pending') {
poll++; // increment poll counter // poll is a global variable to track the number of requests made
if (poll < POLLS) { // POLLS is a global variable to set the maximum number of requests
setTimeout(function() { ajax_poll(); }, INTERVAL); // wait INTERVAL before another AJAX request
} else {
display_error();
}
} else {
success(xhr_data);
}
},
contentType: 'application/json'
});
}
sucesso () é a função que exibe o conteúdo JSON (ou seja, o que eu estou esperando para se tornar disponível enquanto polling) na página.
Uma coisa a notar é que ao testar o código localmente, polling um arquivo de teste .json local, eu posso mudar o conteúdo do arquivo de { "status": "pendente"} para uma resposta contendo conteúdo, como eu estou procurando, salve o arquivo entre instâncias de votação, e na próxima sondagem, o meu código vê o novo conteúdo e funciona como esperado. Ele simplesmente não está funcionando no ambiente de preparação.
Solução
Você pode tentar adicionar o "cache: false"
opção .
Outras dicas
Apenas para descrever uma razão potencial por que isso está ocorrendo:. Você provavelmente estão a emitir solicitações de AJAX GET, mas você não está diferenciando o URL de qualquer maneira (sem dados extra na string de consulta, por exemplo)
O navegador vê este pedido e não se incomodam mesmo para bater o servidor com o pedido integral (provavelmente questões condicionais 304 solicitações GET em vez disso). O resultado final de tudo isso é que você não está vendo a atividade que você esperar para ver.
Uma maneira simples de resolver este problema é não armazenar em cache os resultados da solicitação AJAX ou enviar um pedido POST. Afetando opções de cache é coberto nos outros lugares. O problema com a abordagem POST é que você não está economizando nada por suas ações, e assim você está expressando suas intenções melhor com um pedido GET.