如何继续调用getjson,直到它没有空响应

How to continue calling getjson untill it has no empty response?

本文关键字:响应 getjson 何继续 继续 调用      更新时间:2023-09-26

大家好,我收到了一个getjson调用,想知道如果它是空的或没有所需的字符串(例如查找seasonEpisode=),我如何检查它的响应(siteContents),然后再次调用getjson。我们可以从它内部调用getjsons本身吗?我的目标是从getjson中获得正确的响应。希望你们能帮助我。谢谢

$.getJSON('http://www.mysite.com/doit.php?value=55?', function(data){
    //$('#output').html(data.contents);
 var siteContents = data.contents; 

试试这个:

var handler = function(data){
   //$('#output').html(data.contents);
   var siteContents = data.contents; 
   if (!siteContents) { 
       $.getJSON('http:/...', handler);
       return;
   }
   // handle siteContents
}
$.getJSON('http://...', handler);

edit:在siteContents为空的情况下,上述操作会通过重复尝试向服务器发送垃圾邮件,从而产生无限循环和高负载。我建议两个改进:

1) 计算你重复的空站点内容循环的次数。在某个失败阈值(例如20次尝试)后,用错误消息(如果合适)取消循环。

2) 使用CCD_ 1进行迭代,其中重试之间的延迟是几毫秒。

听起来更好的问题是,为什么服务器在第一次尝试时不返回"正确"的响应?或者,正如NuclearGhost所指出的,为什么它会对同一请求返回不同的响应?

但要实现您所要求的,需要递归。不能只在循环中执行,因为响应是异步的。但是,如果您命名一个函数,您可以在成功处理程序中调用该函数,类似于以下内容:

function getJSONRecursive(maxRetries, count) {
    if(!count) count = 1;
    if (count > maxRetries) {
        alert('Giving up after '+count+' retries.');
        return;
    }
    $.getJSON('http://www.mysite.com/doit.php?', function(data) {
        if(!data || !data.contents || data.contents.indexOf('seasonEpisode') == -1) {
            getJSONRecursive(++count, maxRetries);
        } else  {
            $('#output').html(data.contents);
        }
    })
}

然后像这样调用它:

getJSONRecursive(5);

我不建议在没有计数的情况下进行,因为否则,如果再也没有正确的响应,就会溢出堆栈。如果您要避免的情况是服务器超时或过载问题,那么我建议将递归调用设置为超时,如下所示:

if(!data || !data.contents || data.contents.indexOf('seasonEpisode') == -1) {
    setTimeout(function() { getJSONRecursive(++count, maxRetries)}, 5000);
    // etc.

这会在两次调用之间额外等待5秒,但额外的时间将有助于确保您的服务器不会崩溃,并且您的getjson调用不会很快用完。