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が空の場合に繰り返し試行してサーバーにスパムを送信し、無限ループと高負荷を作成します。私は2つの改善を提案します:

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 に答える