javascript - jQuery AJAX 轮询 JSON 响应,基于 AJAX 结果或 JS

我是一名初级到中级的 JavaScript/jQuery 程序员,因此非常感谢具体/可执行的示例。

我的项目需要使用 AJAX 轮询返回 JSON 的 URL,该 URL 包含要添加到 DOM 的内容,或指示后端正在运行的消息 { "status": "pending"}仍在使用内容生成 JSON 响应。这个想法是,对 URL 的第一个请求会触发后端开始构建 JSON 响应(然后将其缓存),随后的调用会检查此 JSON 是否已准备好(在这种情况下已提供)。

在我的脚本中,我需要每隔 15 秒轮询一次此 URL,最多 1:30 分钟,然后执行以下操作:

  • 如果 AJAX 请求导致错误,则终止脚本。
  • 如果 AJAX 请求成功,且 JSON 内容包含 { "status": "pending"},则继续轮询。
  • 如果 AJAX 请求成功,并且 JSON 内容包含可用内容(即除 { "status": "pending"} 之外的任何有效响应),则显示该内容,停止轮询并终止脚本。

我尝试了一些方法,但效果有限,但我感觉它们都比他们需要的更困惑。这是我成功使用的一个骨架函数,它一次发出一个 AJAX 请求,如果我从 JSON 响应中获得可用内容,它就可以完成它的工作:

// make the AJAX request
function ajax_request() {
  $.ajax({
    url: JSON_URL, // JSON_URL is a global variable
    dataType: 'json',
    error: function(xhr_data) {
      // terminate the script
    },
    success: function(xhr_data) {
      if (xhr_data.status == 'pending') {
        // continue polling
      } else {
        success(xhr_data);
      }
    },
    contentType: 'application/json'
  });
}

但是,除非它接收到包含可用内容的有效 JSON 响应,否则此函数目前什么都不做。

我不知道在那些只是评论的行上该怎么做。我怀疑另一个函数应该处理轮询,并根据需要调用 ajax_request(),但我不知道 ajax_request() 最优雅的方式将其结果传达回轮询函数,以便它能够做出适当的响应。

非常感谢任何帮助!如果我能提供更多信息,请告诉我。谢谢!

最佳答案

您可以使用简单的超时来递归调用 ajax_request。

success: function(xhr_data) {
  console.log(xhr_data);
  if (xhr_data.status == 'pending') {
    setTimeout(function() { ajax_request(); }, 15000); // wait 15 seconds than call ajax request again
  } else {
    success(xhr_data);
  }
}

在那条线上进行反检查,您就获得了最大数量的民意调查。

if (xhr_data.status == 'pending') {
  if (cnt < 6) {
    cnt++;
    setTimeout(function() { ajax_request(); }, 15000); // wait 15 seconds than call ajax request again
  }
}

你不需要在你的错误函数中做任何事情,除非你想发出警报或其他什么。一个简单的事实是它出错会阻止成功函数被调用并可能触发另一个轮询。

关于javascript - jQuery AJAX 轮询 JSON 响应,基于 AJAX 结果或 JSON 内容进行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1406580/

相关文章:

json - 当使用 Spring MVC for REST 时,如何让 Jackson 漂亮地打印

javascript - 将返回的 JSON 对象属性转换为(较低的第一个)camelCase

java - Spring MVC PATCH方法: partial updates

json - 如何使用 Gradle 将 Boon 或 Jackson JSON 解析器添加到 An

python - 尝试从 Django 中的 POST 解析 `request.body`

json - 你能推荐我一个 json 查看器应用程序吗?

javascript - 为什么 Google 在前面加上 while(1);到他们的 JSON 响

ruby-on-rails - 无法在 Ubuntu 上使用 ruby​​ 2.2.3 安装 jso

java - 如何为 Gson 编写自定义 JSON 反序列化器?

c# - 将 JSON 转换为数据表