2016-07-14 4 views
1

それぞれにいくつかの合計データが含まれているAPIを2回呼び出す必要があり、そのあと繰り返し処理が必要になります。コール1は、2つのjsonpオブジェクトを取得します。

[{ 
    "id": 17, 
    "name": "A", 
    "campaign_code": "CAP20481" 
},{ 
    "id": 18, 
    "name": "B", 
    "campaign_code": "CAP20481" 
}] 

コール2は、最初の呼び出しのIDを使用して整数を取得します。私はそれに対応する "名前"と整数が必要です。これまでのところ、私が持っている:

function getStoreCounts() { 
    var campaignID = $("input[title='Campaign ID']").val(); 
    var storeLists = $.ajax({ 
     type: "GET", 
     dataType: "jsonp", 
     url: "/apiIndex?callback=?&campaign_code=" + campaignID.toString(), 
    }), 
    storeCount = storeLists.then(function(data) {  
     $.each(data,function(i,storeList){ 
      $.extend(storeList,{stores:''}); 
      var getCount = $.ajax({ 
       type: "GET", 
       dataType: "jsonp", 
       url: "/apiStoreCount?callback=?&list_id=" + storeList.id.toString(), 
      }); 

      getCount.done(function(count) { 
       storeList.stores = count; 
      }); 

     }); 
     return data; 
    }); 

    storeCount.done(function(data) { 
     console.log(data); 
     $.each(data,function(i,tierCount){ 
      console.log("Tier: "+tierCount.name); 
      console.log("Stores: "+tierCount.stores); 
     }); 
    }); 
} 

最終done約束リターンで私は、全体のデータ配列をログアウトするとき、私は、各オブジェクトを格納するための値をそのまま取得します。しかし、配列内の各オブジェクトを繰り返し処理しようとすると、ストア値が失われてしまいます。 Chromeからの添付ファイル。

enter image description here

+1

呼び出し側の結果を使用します。あなたはそれらの約束を配列として返し、それらをすべて待つ必要があります。また、1回のリクエストですべての情報を返すと、これはずっと簡単になり(サーバーの負担も軽くなります) –

答えて

2

あなたは解決するために、すべての内側の約束を待つ必要があります。 $.when

storeCount = storeLists.then(function(data) { 
    // array of promises  
    var counting = $.map(data,function(storeList){ 
     $.extend(storeList,{stores:''}); 
     var getCount = $.ajax({ 
      type: "GET", 
      dataType: "jsonp", 
      url: "/apiStoreCount?callback=?&list_id=" + storeList.id.toString(), 
     }); 

     return getCount.then(function(count) { 
      storeList.stores = count; 
     }); 

    }); 
    // wait for all 
    return $.when.apply($, counting).then(function() { 
     return data; //return modified data 
    }) 
}); 

名前付けコンビネーションに関する副注釈。あなたの関数の名前はgetStoreCountsですが、undefinedを返します。それは最終的な約束を返す。

function gettingStoreCounts() { 
    var campaignID = $("input[title='Campaign ID']").val(); 
    var storeLists = $.ajax({...}), 
    return storeLists.then(...); 
} 

そして、あなたは `data`を返す前に完了するために、AJAX要求の第二のループを待っていないので、あなたの問題がある

gettingStoreCounts().then(/*log, whatever*/) 
+0

Yury氏に感謝します.Map()が解決する必要があるすべての約束を待つだけではなく、面白​​いことに興味があります。 [これも助けました](http://stackoverflow.com/questions/749084/jquery-map-vs-each)。 – sansSpoon

関連する問題