我是初级到中级的JavaScript / jQuery程序员,因此非常感谢具体/可执行的示例。
我的项目需要使用AJAX轮询返回JSON的URL,该JSON包含要添加到DOM的内容,或者是一条消息 {“ status”:“ pending”} ,该消息指示后端仍在使用内容生成JSON响应。这个想法是,对URL的第一个请求会触发后端以开始构建JSON响应(然后将其缓存),随后的调用将检查此JSON是否准备就绪(在这种情况下已提供)。
在我的脚本中,我需要以15秒的间隔(最长1:30分钟)轮询此URL,然后执行以下操作:
我尝试了几种方法,但收效甚微,但是我感觉到它们都比需要的更加混乱。这是我一次成功使用过的骨架功能,一次可以发出一个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 } }
除非要发出警报或执行其他操作,否则您无需在错误功能中执行任何操作。它的错误将阻止成功函数被调用并可能触发另一个轮询的简单事实。