我需要使用有限的流进行顺序异步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 } }
假设我有三个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 }
接下来的调用可确保从此客户端发出的ajax请求不超过1个
initiateChain(getGadgets, getBooks, getDeals);
现在,我需要增强initializeChain以支持任意数量的流。假设我被允许使用2或n个流,我想知道这样做的想法而无需更改ajax帮助函数getGadgets,getDeals,getDeals。
简而言之,我有一组函数N,在本例中为getGadgets,getDeals和getDeals(| N | = 3),每个函数都需要连接到Web服务器。当前,我一次只能执行一个请求,因此,initialChain函数将依次调用这三个方法。如果我可以访问M个连接,我想执行| N |。并行运行(最多M个)。
如果使用的是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); } })