2012-04-27 72 views
4

如何控制允許多少個異步ajax調用? 比方說,如果我將此限制設置爲3,則第4個請求將排隊,直到3箇中的一個完成。控制jQuery異步ajax調用號碼?

注意:執行Ajax調用的代碼動態插入我的頁面,我沒有控制哪個功能會主動要求..

+0

PS:這很受軟件的啓發,它可以讓你設置可以運行多少個併發線程 – skafandri 2012-04-27 16:35:22

+2

你應該能夠在標準的'.ajax'函數上創建一個包裝器,或超時。 – loganfsmyth 2012-04-27 16:37:59

+0

你是對的!我想知道在我進入此之前是否有更快的解決方案! – skafandri 2012-04-27 16:40:40

回答

0

也許嘗試這樣的事情。我沒有一個方便測試的網站,對不起。

$.queueAjax = (function() { 

    var queue = []; 
    var maxConnections = 4; 
    var running = 0; 

    function flush() { 
    while (running < maxConnections && queue.length) { 
     running += 1; 
     var args = queue.shift(); 
     var xhr = $.ajax.apply($, args); 
     xhr.done(function() { 
     running -= 1; 
     flush(); 
     }); 
    } 
    } 

    return function() { 
    var args = Array.prototype.slice(arguments); 
    queue.push(args); 
    flush(); 
    } 
})(); 

你會調用它就像你做$.ajax但它將緩衝區的請求,只允許4在一次運行。

如果你不想使用一個單獨的函數,你也可以替換主jQuery函數,但這很醜陋。就像這樣:

$.ajax = (function() { 
    var ajax = $.ajax; 

    var queue = []; 
    var maxConnections = 4; 
    var running = 0; 

    function flush() { 
    while (running < maxConnections && queue.length) { 
     running += 1; 
     var args = queue.shift(); 
     var xhr = ajax.apply($, args); 
     xhr.done(function() { 
     running -= 1; 
     flush(); 
     }); 
    } 
    } 

    return function() { 
    var args = Array.prototype.slice(arguments); 
    queue.push(args); 
    flush(); 
    } 
})(); 
+0

其實,我不能使用它,因爲該應用程序充滿了Ajax請求(其他插件,其他開發人員的一些代碼,以前我寫的一些代碼...) – skafandri 2012-04-27 16:50:23

+0

@skafandri更新。 – loganfsmyth 2012-04-27 16:52:50

+0

不錯,但相當醜陋:)我只是以正確的方式覆蓋$ .ajax – skafandri 2012-04-27 17:03:23

0

既然你說過你不能使用任何插件,這是我能想到的,但不能保證效率。

var ajax_calls = new Array(); //全局變量

if(ajax_calls.length < 3){ 
    ajax_calls.push( 
     jQuery.ajax({ 
      url: "target.php", 
      type: "POST", //or GET 
      data: {varname: "value"} 
      }) 
     ); 
} 

然後,您可以在成功時刪除相應的ajax控制器。