小编典典

jQuery AJAX轮询JSON响应,基于AJAX结果或JSON内容进行处理

ajax

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

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

在我的脚本中,我需要以15秒的间隔(最长1:30分钟)轮询此URL,然后执行以下操作:

  • 如果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()将其结果传递回轮询函数的最优雅的方式,以便它可以适当地响应。

很感谢任何形式的帮助!请让我知道是否可以提供更多信息。谢谢!


阅读 216

收藏
2020-07-26

共1个答案

小编典典

您可以使用简单的超时来递归调用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
  }
}

除非要发出警报或执行其他操作,否则您无需在错误功能中执行任何操作。它的错误将阻止成功函数被调用并可能触发另一个轮询的简单事实。

2020-07-26