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

时间:2013-02-05 14:25:35

标签: javascript ajax getjson

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

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

 var siteContents = data.contents; 

2 个答案:

答案 0 :(得分:1)

试试这个:

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

$.getJSON('http://...', handler);

编辑:如果siteContents为空,上面会重复尝试垃圾邮件 - 创建无限循环和高负载。我建议两点改进:

1)计算你做了多少重复的空siteContents循环。在某个故障阈值(例如,20次尝试)之后,使用错误消息(如果适用)取消循环。

2)使用setTimeout(function() { $.getJSON(...) }, delay)进行迭代,其中延迟在重试之间等待几毫秒。

答案 1 :(得分:0)

听起来更好的问题是为什么您的服务器在第一次尝试时没有返回“正确”的响应?或者正如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通话不会过快地自行运行。