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

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

Вопрос

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

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

Когда я обновляю страницу, содержащую код опроса, он обычно работает с первым запросом, т. е. получает полный ответ 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 " : "в ожидании" } для ответа, содержащего искомое содержимое, сохраняйте файл между экземплярами опроса, и при следующем опросе мой код видит новое содержимое и работает, как и ожидалось. Это просто не работает в промежуточной среде.

Это было полезно?

Решение

Вы можете попробовать добавить " кэш: false " вариант .

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top