2016-07-14 103 views
1

我需要對API進行2次調用,每個API都包含一些總數據,然後需要迭代。調用1獲取兩個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

你的問題是因爲你沒有等待AJAX​​請求的第二循環返回'data'之前完成。您需要將這些承諾作爲數組返回並等待它們。另外請注意,如果您在單個請求中返回所有這些信息,這將會簡單得多(並且對您的服務器要求不高)。 –

回答

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(...); 
} 

並使用呼叫方的結果

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

感謝Yury,有趣的是,它不僅僅是等待所有的解決方案 - .map()需要修改數據。 [這也幫助](http://stackoverflow.com/questions/749084/jquery-map-vs-each)。 – sansSpoon