0

次のような入れ子になった一連の ajax 呼び出しがあります。

function getSubcategories(cat,callback) {
  $.ajax({
    url:'myurl.php',
    data:'q='+cat,
    dataType='json',
    success:function(result){ callback(result) }
  });
}

function getSubcatElements(subcat,callback) {
  $.ajax({
    url:'myurl2.php',
    data:'q='+subcat,
    dataType='json',
    success:function(result){ callback(result) }
  });
}  

function organizeData(cat,callback) {
getSubcategories(cat,function(res){
  totals=0;
  list=new Array;
  $.each(res['subcat'],function(key,val){
    getSubcatElements(val,function(items){
      $.each(items['collection'],function(key2,val2) {
        list.push(val2['descriptor']);
      });
      totals+=items['count'];
      // If I shove "totals" and "list" into an object here to callback, obviously gets called many times
    }
    // If I return an object here, it doesn't actually have counts from the asynchronous call above
  }

function doStuff(cat) {
  organizeData(cat,function() {
    //stuff
  });

したがって、別の非同期クエリの子であるループ非同期クエリを実行しています。「遅延」することなく、子ループの最終結果が必要です。現在、更新された結果を返すだけなので、数値は数回変化しますが、一気にやりたいと思います。

結果を非同期に保存し、 の後に返すのが$.each()当然のようですが、JavaScript は正気ではなく、自明性などを嘲笑します。これには関与すべきだと思います$.Deferred()が、私が見つけたサンプルはすべて、最初の反復後にトリガーする必要があるように見えました...

(関数は意図的に分離されています。これは、一方のみを使用する理由や他方のみを使用する理由がある場合があるためです)。

前もって感謝します!

4

2 に答える 2

0

まず、サーバー側でデータベース クエリを整理して、単一の多重化された結果を返すようにする必要があります。何度も呼ぶのではなく。

それを除けば、カテゴリ呼び出しが返されるまで呼び出すサブカテゴリの数がわからない場合、最善の策は、呼び出しを行うたびにカウントアップしてからカウントダウンするグローバル var を作成することです。コールバックが結果を受け取るたびに。コールバックが発生し、カウントダウンし、新しいカウントがゼロになるたびに、更新を行います。

于 2013-11-03T06:32:55.597 に答える