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