【问题标题】:AJAX polling of a URL returning JSON doesn't seem to return fresh responses (using jQuery $.ajax() method)返回 JSON 的 URL 的 AJAX 轮询似乎没有返回新的响应(使用 jQuery $.ajax() 方法)
【发布时间】:2010-11-27 15:03:23
【问题描述】:

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

我设置了一个轮询函数,可以按预期重复从 URL 请求 JSON。但是,问题是它继续获得响应 { "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" } 更改为包含像我正在寻找的内容,在轮询实例之间保存文件,然后在下一次轮询时,我的代码会看到新内容并按预期工作。它只是在暂存环境中不起作用。

【问题讨论】:

    标签: javascript jquery ajax json polling


    【解决方案1】:

    您可以尝试添加"cache: false" option

    【讨论】:

    • 非常感谢,已解决!当您使用“相关”链接发布此问题时,我实际上发现了一个具有相同解决方案的问题。我在发布之前进行了搜索,但我一定没有使用正确的术语。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢大卫,我很感激你的意见 - 现在更有意义了。
    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多