AJAX polling de um URL retornando JSON não parece retornar respostas frescos (Método do jQuery $ .ajax ())

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

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.

Foi útil?

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.

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