6

ダースの非同期 ajax リクエストを実行する関数を作成し、すべてが終了するのを待ってから、集約された情報を返したいと思います。お気に入り:

function countHealthy(urls) {
  var healthy = 0;
  for (var i = 0; i < urls.length; ++i) {
    $.ajax({url: urls[i], async: true, id: i})
    .done(function (data) { ++healthy; });
  }
  // Wait for all ajax to finish.
  return healthy;
}

PS: ++healthy はスレッドセーフですか?

4

5 に答える 5

6

Javascript にはスレッドがないため、スレッド セーフは問題になりません。return ステートメントが問題です。完了時に ajax 呼び出しが実行されるコールバックに入れる必要があります。ajax は非同期で発生するため、コードがそのままの状態では、return ステートメントはすべてのリクエストが戻る前に起動します。

このタイプのために生まれたと思われるquery deferredsをチェックしてみてください。そのリンクから直接

function doAjax() {
  return $.get('foo.htm');
}

function doMoreAjax() {
  return $.get('bar.htm');
}

$.when( doAjax(), doMoreAjax() )
  .done(function() {
    console.log( 'I fire once BOTH ajax requests have completed!' );
  })
  .fail(function() {
    console.log( 'I fire if one or more requests failed.' );
  });

少しリファクタリングするだけで、約 2 分でこれを実装できます。

または、サーバーを制御する場合は、1 つの要求ですべてのチェックを行うサーバー エンドポイントを作成できます。

于 2013-04-05T11:57:51.157 に答える
1

あなたはこれを行うことができます:

var urls= ['url1', 'url2', 'url3', 'url4'];
function doTheUrl() {
    if (urls.length === 0) {
        alert('All urls are done now.');
        return;
    }

    var url = urls.pop();
    $.ajax({
        url: "/DoTheJob",
        complete: function () {
            doTheUrl();
        }
    });
};
于 2013-04-05T12:01:18.933 に答える
0

複雑なページがある場合は、非同期呼び出しだけが返されるまで追跡して待機する必要があります。これは、重要ではない他の呼び出しが実行されている可能性があるためです。

そうは言っても、単純なページの場合は、呼び出しがないことを確認して待つことができます. この jQuery スクリプトは、現在の非同期リクエストがあるかどうかを四半期ごとにチェックし、四半期ごとに 1 秒ごとに確認します。何もなくなったら、次に進みます。

    var WaitForAjax = function()
    {
        if (jQuery.active == 0){
        }
        else
        {
            setTimeout(WaitForAjax, 250);
        }
    }

    function RunIt()
    {
        //IssueAjaxCalls would be where you make all your Ajax calls.
        IssueAjaxCalls();

        WaitForAjax();

        //The KeepGoing function won't get called until there are no more Ajax calls pending.
        KeepGoing();
    }
于 2016-04-05T16:10:42.580 に答える
0

多分あなたはこれを試すことができます。すべての ajax 呼び出しが返されるまで return ステートメントがヒットしないように、空の while ループを実行しているだけです。

function countHealthy(urls) {
  var healthy = 0;
  var urlCount = urls.length;
  var numberOfAjaxCallsReturned = 0;
  for (var i = 0; i < urls.length; ++i) {
    $.ajax({url: urls[i], async: true, id: i})
      .done(function (data) { 
              ++healthy;
              numberOfAjaxCallsReturned++;
      });
    }
    while(numberOfAjaxCallsReturned!=urlCount)
    {
    }
    return healthy;
}
于 2013-04-05T12:05:58.167 に答える