0

目的の結果が満たされない場合に、ajax呼び出しで値を抽出し、目的の結果に達するまでX秒ごとに(またはユーザーの要求に応じて)繰り返し続ける方法はありますか?

呼び出しの応答は、jsonでシリアル化された配列として表示されます。$status_codeajax呼び出しは、 is1またはresponse==になるまで繰り返し続けたいと思い"error_bad_api_call"ます。

古いコードを切り取った

更新:(回答)

呼び出すPHPスクリプト(10%の確率で期待される結果が得られます)

<?php

$retArr = array();
$rand = rand(1, 1000);

if($rand < 100)
{
    $retArr["status_code"] = 1;
    echo json_encode($retArr);
}
else
{
    $retArr["status_code"] = 0;
    echo json_encode($retArr);
}

?>

javascript + html

<html>
<head>
<script src="include/jquery-1.7.2.min.js"></script>
<script src="include/jquery.json-2.3.min.js"></script>
<script type="text/javascript">
//Clean all elements on button click
function dosubmitClean(tries)
{
    document.getElementById("resultsHere").innerHTML="";
    document.getElementById("temp").innerHTML="";
    document.getElementById("tries").innerHTML="";

    dosubmit(tries); //Do actual work
}

function dosubmit(tries)
{
    if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else{// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function(){
        if (xmlhttp.readyState==4 && xmlhttp.status==200){
            var resp = xmlhttp.responseText; //Get response
            document.getElementById("temp").innerHTML+="resp: "+xmlhttp.responseText+"<br/>"; //Show in event log

            var status_code = $.evalJSON(resp).status_code; //Get status code
            document.getElementById("temp").innerHTML+="status_code: "+status_code+"<br/>"; //Show in event log

            document.getElementById("temp").innerHTML+="Checking status code <br/>"; //Show in event log
            if(status_code == "1"){
                document.getElementById("resultsHere").innerHTML+="status_code: is one <br/>"; //Show final result
                document.getElementById("temp").innerHTML+="status_code: is one <br/>"; //Show in event log
                document.getElementById("tries").innerHTML="Amount of tries: "+tries+"<br/><br/>Event log:<br/>"; //Show amount of tries
            }
            else{
                document.getElementById("temp").innerHTML+="status_code: is NOT one <br/>"; //Show in event log
                tries++; //Tries + 1
                dosubmit(tries,"someval"); //Loop
            }
            document.getElementById("temp").innerHTML+="Done checking status code <br/><br/>"; //Show in event log
        }
    }
    xmlhttp.open("GET","json_repeat_php.php",true);
    xmlhttp.send();
}
</script>
</head>
<body>

<input type="submit" value="submit" id="postDataSubmit" onClick="dosubmitClean(<?php echo 1; ?>);return false;">

<div id="resultsHere"></div>
<div id="tries"></div>
<div id="temp"></div>
</body>
</html>

出力例:

status_code: is one
Amount of tries: 2

Event log:
resp: {"status_code":0}
status_code: 0
Checking status code
status_code: is NOT one
Done checking status code

resp: {"status_code":1}
status_code: 1
Checking status code
status_code: is one
Done checking status code
4

3 に答える 3

1

はい、再帰的に実行できます。

function send_request() 
{
    // perform ajax here and have a callback 
    // if value from callback indicates not successful call send_request() again
    send_request(); 
    // you may want to keep a count of how many times it fails, if it fails say, more than a set number of times then you can take the appropriate action 
}

send_request();  
于 2012-04-18T20:40:49.947 に答える
1

問題がどこにあるのかわかりませんが、私があなたのことを正しく理解していれば、次のように説明していただければ十分です。

function gather(queue) {
    data = $('form#foo').serialize();
    if (typeof queue != 'undefined') {
        data += '&queue=' + queue;
    } else {
        queue = 0;
    }
    $.ajax('/frontend_test.php', data, function(r) {
        var result = $.parseJSON(r);
        if (typeof result.status_code == 'undefined' || result.status_code != 1) {
            gather(++queue);
        } else {
            // Success, do whatever you need to.
        }
    });

そして、呼び出すだけでそれを使用すると...結果に到達しません-インクリメントされたキューを使用して再帰呼び出しに進みます。最初の呼び出しは引数を使用する必要はありません。

それがまさにあなたが必要とするものであることを願っています。

于 2012-04-19T06:40:21.787 に答える
1

これはとても簡単です。すでにコールバック関数があり、結果を待っています。

結果を現在のように html として返すのではなく、JSON として返すようになりました。これにより、クライアント側で簡単に評価できます。elseif{...}php-code に必要な queueCodes を含めます。

これは次のようになります (注意、これは疑似コードのみです!):

your json = { success : 0|1 , resultarray [item,item] /* only if success=1 */ , someMoreInfo : <queueCode> }

if ( success ){
     // populate your html with the resulting items
}
else{
     //perhaps wait some time, then
     // call your ajax function again, with your queuecode as parameter
     dosubmit( json.someMoreInfo );
}

dosubmit関数はキューコードをサーバーに送信します。

サーバーまたはクライアントのいずれかで、より適したものであれば、タイムアウトが役立つ場合があります。

さらに、 JSONPを見てみることをお勧めします。

補足: PHP の elseif ブランチでスイッチを使用する方が適切な場合があります。{また、 JavaScript コードの改行に the を書くのを避け、常にfunction(){orを書くようにしてくださいelse{。これにより、javascript コンパイラがコードを評価しようとする際のトラブルを回避できる可能性があります。

例:

return{
   object
}
// returns the object

は同じである必要がありますが、次のものと同じではありません:

return // comiler will add a ; after your return, thus your object won't be returned
{
   object
}
于 2012-04-18T20:34:31.230 に答える