0

大家好,我接到了一个 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; 
4

2 回答 2

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) 其中延迟为几毫秒以在重试之间等待。

于 2013-02-05T14:36:12.723 回答
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 调用不会很快耗尽自己。

于 2013-02-05T14:42:32.163 回答