我有一个非常基本的方案:运行3 Google地图放置网址并在每次成功时显示结果
这是我到目前为止所做的:
var values = ["url1", "url2", "url3"];
values.forEach(function(value, i) {
var jsonReq = JSON.stringify({
action: 101,
supported: value
});
...
$.ajax({
type: "POST",
url: "data.ajax.php",
dataType:"json",
data:{
data:jsonReq
},
success:function(data){
// parse results
....
}
});
});
问题是我在循环中运行所有3个网址而无需等待成功。
我只想在从前一个获得响应(回调)时发送下一个请求。
有什么建议吗?
谢谢,
答案 0 :(得分:5)
尝试递归而不是......像这样
var currentR = 0;
var values = ["url1", "url2", "url3"];
function sendReqests()
{
if(!values[currentR])
return false;
var jsonReq = JSON.stringify({
action: 101,
supported: values[currentR]
});
$.ajax({
type: "POST",
url: "data.ajax.php",
dataType:"json",
data:{
data:jsonReq
},
success:function(data){
currentR++;
if(values[currentR]){
sendReqests();
}
}
});
}
// call the recursive function
sendReqests();
答案 1 :(得分:3)
在ajax请求中的完整函数中调用下一个请求
var values = ["url1", "url2", "url3"];
values.forEach(function(value, i) {
var jsonReq = JSON.stringify({
action: 101,
supported: value
});
...
$.ajax({
type: "POST",
url: "data.ajax.php",
dataType:"json",
data:{
data:jsonReq
},
success:function(data){
// parse results
....
},
complete: function(){
}
});
})
答案 2 :(得分:1)
您可以使用setTimeout代替循环
var values = ["url1", "url2", "url3"];
var index = 0;
function repeatedCall(value, i) {
var jsonReq = JSON.stringify({
action: 101,
supported: values[index]
});
index++;
if(index == 4)
clearTimeout(loop );
else
setTimeout(repeatedCall, 0);
}
var loop setTimeout(repeatedCall, 0);
答案 3 :(得分:1)
而不是foreach
,您可以使用every
,因为every
的中断比foreach
更容易
var values = ["url1", "url2", "url3"];
function ajaxCall(value) {
var jsonReq = JSON.stringify({
action: 101,
supported: value
});
$.ajax({
type: "POST",
url: "data.ajax.php",
dataType:"json",
async: false,
data:{
data:jsonReq
},
success:function(data){
// parse results
// if success
// return true
// else
// return false
}
});
return true;
}
values.every(ajaxCall);