有没有办法进行ajax调用,如果没有达到预期的结果,提取一个值并每隔X秒(或用户请求)继续重复,直到达到所需的结果?
调用的响应表示为json序列化数组。我希望ajax调用能够在$status_code
为1
或响应== "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
答案 0 :(得分:1)
这很简单。你已经有了回调函数,等待结果。
现在,不要像现在那样将结果作为html返回,而是将其作为JSON返回,这样您就可以在客户端轻松评估它。
在php-code的elseif{...}
中包含必要的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代码中的换行符上写{
,而是始终写function(){
或else{
。这可能会让您在尝试评估代码的JavaScript编译器时遇到麻烦。
示例:
return{
object
}
// returns the object
应该相同,但不一样:
return // comiler will add a ; after your return, thus your object won't be returned
{
object
}
答案 1 :(得分: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();
答案 2 :(得分: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.
}
});
只是通过调用它来使用它...结果将无法到达 - 它会进行递归调用,增加队列,第一次调用不需要使用任何参数。
希望这正是你所需要的。