1

我的项目需要使用 AJAX 轮询某个 URL 以获得 JSON 响应。我发出的第一个 AJAX 请求提醒服务器我需要一些 JSON 内容,它开始构建和缓存响应,为每个后续 AJAX 请求发送回{"status":"pending"}直到 JSON 准备好。此时,响应更改为 JSON,其中包含我可以在文档中解析和显示的内容,只要 URL 返回{ "status" : "pending" }以外的任何内容,我就想这样做。

我设置了一个轮询函数,可以按预期重复从 URL 请求 JSON。但是,问题是即使我直接导航到 URL 并且可以看到完整的 JSON 响应已准备好并正在提供服务,它仍会继续获得响应{“status”:“pending”} 。出于某种原因,我的轮询函数仍然得到{ "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" }更改为包含我正在寻找的内容的响应,保存轮询实例之间的文件,并且在下一次轮询时,我的代码会看到新内容并按预期工作。它只是在暂存环境中不起作用。

4

2 回答 2

5

您可以尝试添加"cache: false" 选项

于 2009-09-11T19:45:07.363 回答
2

只是为了描述发生这种情况的潜在原因:您可能正在发出 GET AJAX 请求,但您没有以任何方式区分 URL(例如,查询字符串中没有额外的数据)。

浏览器看到这个请求,甚至都懒得用完整的请求访问服务器(它可能会发出有条件的 304 GET 请求)。所有这一切的最终结果是您没有看到您希望看到的活动。

解决此问题的一种简单方法是不缓存 AJAX 请求的结果或发送 POST 请求。其他帖子中介绍了影响缓存选项。POST 方法的问题在于您没有通过您的操作保存任何内容,因此您可以通过 GET 请求更好地表达您的意图。

于 2009-09-11T20:06:54.580 回答