具有多个ajax请求的速率限制

时间:2015-10-23 05:54:38

标签: javascript jquery ajax

我试图限制我的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)
    }
}

2 个答案:

答案 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循环中,您需要使用索引来确定需要等待的时间。请求被触发后。