小编典典

如何使用给定数量的流执行顺序异步ajax请求

ajax

我需要使用有限的流进行顺序异步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个)。


阅读 211

收藏
2020-07-26

共1个答案

小编典典

如果使用的是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);
    }

})
2020-07-26