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