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

2019-07-17 15:59发布

我是一个新手到中间的JavaScript / jQuery的程序员,所以具体的/可执行的例子是非常赞赏。

我的项目需要使用AJAX来轮询返回包含任一内容被添加到DOM JSON一个URL,或消息{“状态”:“未决”},指示该后端仍然工作于生成与所述内容的JSON响应。 这个想法是,该URL的第一请求触发后端开始构建一个JSON响应(然后缓存),以及后续调用检查是否该JSON准备好(在这种情况下,它提供)。

在我的剧本,我需要轮询以15秒间隔此URL高达1:30分钟,并执行以下操作:

  • 如果AJAX请求导致错误,终止脚本。
  • 如果AJAX请求引起了成功,而JSON内容包含{“地位”:“挂起”},继续扫描。
  • 如果AJAX请求导致成功,和JSON内容包含可用内容(即,比{“状态”:“未决”}其他任何有效响应),则显示该内容,停止轮询和终止脚本。

我试着与有限的成功,几个办法,但我得到这个意义上,他们比他们需要的所有混乱。 下面是我成功用于制造的时间,如果我从JSON响应可用含量,它的工作一个AJAX请求骨骼功能:

// 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 _按需请求(),但我不知道AJAX最优雅的方式_请求()来备份传达其结果轮询功能,使得它可以回应适当。

很感谢任何形式的帮助! 请让我知道如果我能提供任何更多的信息。 谢谢!

Answer 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
  }
}

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



Answer 2:

非常感谢你的功能。 这是一个有点马车,但这里是修复。 roosteronacid的回答达到100%后不会停止,因为调用clearInterval函数错误使用。

这里是一个工作的功能:

$(function ()
{
    var statusElement = $("#status");

    // this function will run each 1000 ms until stopped with clearInterval()
    var i = setInterval(function ()
    {
        $.ajax(
        {
            success: function (json)
            {
                // progress from 1-100
                statusElement.text(json.progress + "%");

                // when the worker process is done (reached 100%), stop execution
                if (json.progress == 100) clearInterval(i);
            },

            error: function ()
            {
                // on error, stop execution
                clearInterval(i);
            }
        });
    }, 1000);
});

调用clearInterval()函数becomming间隔id作为参数,然后一切都很好;-)

聂干杯



Answer 3:

关闭我的头顶:

$(function ()
{
    // reference cache to speed up the process of querying for the status element
    var statusElement = $("#status");

    // this function will run each 1000 ms until stopped with clearInterval()
    var i = setInterval(function ()
    {
        $.ajax(
        {
            success: function (json)
            {
                // progress from 1-100
                statusElement.text(json.progress + "%");

                // when the worker process is done (reached 100%), stop execution
                if (json.progress == 100) i.clearInterval();
            },

            error: function ()
            {
                // on error, stop execution
                i.clearInterval();
            }
        });
    }, 1000);
});


Answer 4:

您可以使用JavaScript的setInterval函数加载内容每5秒。

var auto= $('#content'), refreshed_content; 
    refreshed_content = setInterval(function(){
    auto.fadeOut('slow').load("result.php).fadeIn("slow");}, 
    3000);

供你参考-

自动刷新的div内容,每3秒



文章来源: jQuery AJAX polling for JSON response, handling based on AJAX result or JSON content