4

許可される非同期 ajax 呼び出しの数を制御するにはどうすればよいですか? たとえば、この制限を 3 に設定すると、3 つのうちの 1 つが完了するまで 4 番目の要求がキューに入れられます。

注: ajax 呼び出しを実行するコードがページに動的に挿入されます。どの関数が要求を行うかを制御することはできません..

4

2 に答える 2

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();
  }
})();
于 2012-04-27T16:47:26.010 に答える
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 コントローラーを削除できます。

于 2012-04-27T17:06:39.730 に答える