より良い質問は、なぜサーバーが最初の試行で「正しい」応答を返さないのかということのように思えます。または、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呼び出しがすぐに使い果たされないようにするのに役立ちます。