2012-04-27 3 views
4

どのように非同期のajax呼び出しを許可するかを制御できますか? この制限を3に設定すると、3番目の要求が完了するまで4番目の要求がキューに入れられます。コントロールjQuery非同期Ajaxは番号を呼び出しますか?

注:AJAX呼び出しを実行するコードの私のページに動的に挿入されて、私は機能が要求を行いますれている制御することはできません。..

+0

PS:これは実行可能なスレッドの数を設定できるソフトウェアに非常に触れられています – skafandri

+2

標準の '$ .ajax'関数では、以前のものが返されるまで要求をキューに入れることができるはずですタイムアウトする。 – loganfsmyth

+0

あなたは正しいです!私はこれに入る前に、より速い解決策があるかどうか疑問に思っていました! – skafandri

答えて

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を一度に実行することができるようになります。

別の関数を使いたくない場合は、main 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

+0

@skafandriが更新されました。 – loganfsmyth

+0

素敵ですが、かなり醜い:)私はちょうど正しい方法で$ .ajaxをオーバーライドします。 – skafandri

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コントローラを削除することができます。

関連する問題