我试图限制我的ajax请求以保持在api限制内。我向我的服务器发出一个请求,它返回一个数据列表。从该数据列表中,我向api发出请求,该API不允许每秒接收多个请求。如何使用setTimeout或类似函数来限制我的请求?
myArray = ['1','2','3'];
function f1(){
for (var num in myArray){
$.ajax({
type: "POST",
url: "backend.php",
data: {suburbs : num},
success: function(data){
for (var item in data){
f2(data[item])
}
}
});
}
}
function f2(text) {
$.getJSON("http://example.com/test.html?" + text, null, function (data) {
console.log(data)
}
}
答案 0 :(得分:1)
只需创建一个功能列表:
var duration = 1000; // API duration
var expectAsync = 3000; // time to wait for new functions;
var lastCall = Date.now();
var myArray = ['1','2','3'];
function queryArray() {
var fnList = [];
myArray.forEach(function(v){
fnList.push( function() { // push f1 to list;
$.ajax({
type: "POST",
url: "backend.php",
data: {suburbs : v},
success: function(data){
fnList.push(function(){ // push f2, after we get response;
for (var item in data){
f2(data[item]);
}
})
}
})
});
// here we go;
var int;
int = setInverval(function(){
if(fnList.length){
var fn = fnList.shift(); // pop first function from left;
fn();
}else{
if((Date.now() - lastCall) > expectAsync) clearInterval(int);
}
lastCall = Date.now();
}, duration);
}
答案 1 :(得分:0)
setTimeout不像java的睡眠那样工作。它与回调异步。时间结束后,回调函数被触发,这意味着您要将请求放入回调函数中。
myArray = ['1','2','3'];
function f1(){
for (var i = 0; i < myArray.length; i++){
$.ajax({
type: "POST",
url: "backend.php",
data: {suburbs : myArray[i]},
success: function(data){
for (var j = 0; j < data.length; j++){
setTimeout(function() {
f2(data[j]);
}, (i*data.length + j)*1000);
}
}
});
}
}
在for循环中,您需要使用索引来确定需要等待的时间。请求被触发后。