大家好,我得到了一个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;
答案 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通话不会过快地自行运行。