AJAX-опрос URL-адреса, возвращающего JSON, похоже, не возвращает свежие ответы (с использованием метода jQuery $ .ajax ()) - PullRequest
1 голос
/ 11 сентября 2009

Мой проект требует опроса определенного URL-адреса для ответа JSON, используя AJAX. Первый запрос AJAX, который я отправляю, предупреждает сервер о том, что я хочу получить некоторое содержимое JSON, и он начинает создавать и кэшировать ответ, отправляя мне обратно {"status": "pending"} для каждого последующего запроса AJAX до JSON готов. В этот момент ответ меняется на JSON, содержащий содержимое, которое я могу проанализировать и отобразить в документе, что я хочу сделать, как только URL-адрес вернет что-либо, кроме {"status": "pending"} .

Я установил функцию опроса, которая работает, как и ожидалось, для повторного запроса JSON из URL. Однако проблема заключается в том, что он продолжает получать ответ {"status": "pending"} , даже когда я перехожу непосредственно к URL и вижу, что полный ответ JSON готов и обслуживается. По какой-то причине моя функция опроса по-прежнему получает {"status": "pending"} .

Когда я обновляю страницу, содержащую код опроса, он обычно работает с первым запросом, то есть получает полный ответ JSON. Это наводит меня на мысль, что это какая-то проблема с кэшированием, но я не уверен, где и почему. Разве каждый AJAX-запрос не должен получать новый ответ, или это можно настроить в моем вызове $. Ajax () ?

Вот код, который я сейчас использую:

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'
  });
}

success () - это функция, которая отображает содержимое JSON (т.е. то, что я жду, чтобы стать доступным при опросе) на странице.

Стоит отметить, что во время локального тестирования кода, опроса локального тестового файла .json я могу изменить содержимое файла с {"status": "pending"} на ответ, содержащий содержимое как я ищу, сохраняйте файл между экземплярами опроса, и при следующем опросе мой код видит новый контент и работает как положено. Это просто не работает в промежуточной среде.

Ответы [ 2 ]

5 голосов
/ 11 сентября 2009

Вы можете попробовать добавить опцию "cache: false" .

2 голосов
/ 12 сентября 2009

Просто, чтобы описать потенциальную причину, по которой это происходит: вы, вероятно, отправляете запросы GET AJAX, но вы никоим образом не дифференцируете URL (например, в строке запроса нет дополнительных данных).

Браузер видит этот запрос и даже не удосуживается поразить сервер полным запросом (вместо этого он, вероятно, выдает условные 304 запроса GET). Конечным результатом всего этого является то, что вы не видите активности, которую ожидаете увидеть.

Простой способ решить эту проблему - не кэшировать результаты запроса AJAX или отправлять запрос POST. Влияние на параметры кэша рассматривается в других сообщениях. Проблема с подходом POST заключается в том, что вы ничего не сохраняете своими действиями, и поэтому вы лучше выражаете свои намерения с помощью запроса GET.

...