我需要使用有限的流来创建顺序异步ajax请求.截至目前,我被允许在Web服务器上只占用一个流,所以我只能在时间上执行一个ajax请求.
我有以下功能,当我被允许一次只使用一个流时,它可以帮助我.
function initiateChain() {
var i = 0;
var tasks = arguments;
var callback = function () {
i += 1;
if (i != tasks.length) {
tasks[i](callback); //block should call callback when done otherwise loop stops
}
}
if (tasks.length != 0) {
tasks[0](callback); //initiate first one
}
}
Run Code Online (Sandbox Code Playgroud)
假如我有三个ajax辅助函数
function getGadgets(callback) {
//ajax call
callback(); // I call this in complete callback of $.ajax
}
function getBooks(callback) {
//ajax call
callback(); // I call this in complete callback of $.ajax
}
function getDeals(callback) {
//ajax call
callback(); // I call this in complete callback of $.ajax
}
Run Code Online (Sandbox Code Playgroud)
以下调用可确保从此客户端发出不超过1个ajax请求
initiateChain(getGadgets, getBooks, getDeals);
Run Code Online (Sandbox Code Playgroud)
现在我需要增强initiateChain以支持任意数量的流.假设我可以使用2或n个流我想知道这样做但不更改ajax辅助函数getGadgets,getDeals,getDeals.
简而言之,我有一组函数N,在这种情况下,getGadgets,getDeals和getDeals(| N | = 3)每个都需要连接到Web服务器.目前,我一次只能执行一个请求,因此initiateChain函数按顺序调用这三个方法.如果我有权访问M连接,我想执行| N | 并行功能(最多M个).
小智 15
如果你正在使用jQuery,那么你可以使用它的.queue方法来排队你的ajax调用,然后按顺序执行它们.要运行多个序列,可以将初始出列包装在循环中.
function add_api_call_to_queue(qname, api_url) {
$(document).queue(qname, function() {
$.ajax({
type : 'GET',
async : true,
url : api_url,
dataType : 'json',
success : function(data, textStatus, jqXHR) {
// activate the next ajax call when this one finishes
$(document).dequeue(qname);
}
});
});
}
$(document).ready(function() {
var queue_name = 'a_queue';
var concurrent_calls = 2;
// add first AJAX call to queue
add_api_call_to_queue(queue_name, '/example/api/books');
// add second AJAX call to queue
add_api_call_to_queue(queue_name, '/example/api/dvds');
// add third AJAX call to queue
add_api_call_to_queue(queue_name, '/example/api/shoes');
// start the AJAX queue
for (i=0;i<concurrent_calls;i++) {
$(document).dequeue(queue_name);
}
})
Run Code Online (Sandbox Code Playgroud)