【发布时间】: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