【问题标题】:Queuing/throttling jQuery ajax requests排队/限制 jQuery ajax 请求
【发布时间】:2014-07-04 10:05:05
【问题描述】:

我需要在服务器上触发一些 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 请求,但我很高兴它们能够并行触发,只是有延迟。

【问题讨论】:

  • setTimeout 不能选择任意延迟?
  • 我正在使用setTimout(),问题在于处理deferred 对象。
  • 我猜你需要处理每个请求的 $.when 部分......或者你等到所有的东西都被发送然后在什么时候做......

标签: javascript jquery ajax jquery-deferred


【解决方案1】:

您遇到的第一件事是when() 不适用于数组。它接受任意的 Promise 列表,因此您可以通过以下方式应用数组来解决此问题:

$.when.apply(null, promiseList).done(function(){
    // Do something
    // use the `arguments` magic property to get an ordered list of results
});

其次,节流方法可以使用 {delay:timeInSeconds} 的 $.ajax 参数来完成,但我提出了一个解决方案,它设置了一个新的 defered,它立即返回(以保持顺序)但在超时后解决.

查看http://jsfiddle.net/9Acb2/1/ 了解交互式示例

【讨论】:

  • (a) 我确信$.when() 是这样工作的!检查并且你是正确的它不接受数组。奇怪,这似乎是显而易见的事情。 (b) 我在 jQ 文档中看不到用于 ajax 请求的 delay 参数? (c) 你的小提琴很完美,我没想到像那样手动创建$.Deferreds()。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-10-20
  • 2019-03-07
  • 1970-01-01
  • 2017-01-03
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
相关资源
最近更新 更多