编程语言
首页 > 编程语言> > javascript – 排队/限制jQuery ajax请求

javascript – 排队/限制jQuery ajax请求

作者:互联网

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

例如

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请求开始由setTimeout()发送.有没有一种简单的方法来创建最初的ajax请求,然后“暂停”它们,然后使用setTimeout()触发它们.

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

解决方法:

你磕磕绊绊的第一件事就是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参数来完成,但我提出了一个解决方案来设置一个新的deferred,它会立即返回(保持顺序)但在超时后解析.

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

标签:jquery,javascript,ajax,jquery-deferred
来源: https://codeday.me/bug/20190624/1278172.html