排队/限制jQuery ajax请求

时间:2014-07-04 10:05:05

标签: javascript jquery ajax jquery-deferred

我需要在服务器上发出一些ajax请求,然后在完成后运行回调。通常使用jQuery' deferred.done()这很容易。但是为了避免压倒服务器,我会对请求进行排队,并且每隔X毫秒触发一次。

e.g

var promisesList = [];

var addToQueue = function(workflow) {
    workflowQueue.push(workflow);
  }

var startWorkflow = function(workflow) {
    return $.ajax($endointURL, {
      type: "POST",
      data: {
        action: workflow.id
      },
      success: function() {
      },
      error: function(jqXHR, textStatus, errorThrown) {
      }
    });
  };

  var startWorkflows = function() {
    var promisesList = [];
    if (workflowQueue.length > 0) {
      var workflow = workflowQueue.shift();
      promisesList.push(startWorkflow(workflow));
      setTimeout(startWorkflows, delay);
    }
  };

startWorkflows();
$.when(promisesList).done(function(){
  //do stuff
});

问题是,promisesList数组最初是空的,因此done()回调会立即触发,然后 ajax请求开始由{发送{1}}。有没有一种简单的方法来创建最初的ajax请求,并且有一种"暂停"他们,然后使用setTimeout()解雇他们。

我已经找到了各种节流/队列实现来顺序触发ajax请求,但是我很高兴它们被并行触发,只是延迟了它们。

1 个答案:

答案 0 :(得分:4)

你要绊倒的第一件事是when()不会以这种方式使用数组。它接受任意的promises列表,因此您可以通过使用:

应用数组来解决这个问题
$.when.apply(null, promiseList).done(function(){
    // Do something
    // use the `arguments` magic property to get an ordered list of results
});

其次,限制方法可以使用{delay:timeInSeconds}的$ .ajax param来完成,但是我提出了一个解决方案来设置一个新的deferred,它会立即返回(以保持顺序)但是在之后解决了超时。

有关交互式示例,请参阅http://jsfiddle.net/9Acb2/1/