2015-09-07 46 views
0

我有一個關於AngularJS中的異步數據調用的問題。使用數據從一個異步API調用到另一個

問題是我將從一個API調用中接收數組中的多個對象,並且我將不得不使用來自不同API調用的數據來擴展這些對象。

我在考慮嵌套異步調用,但是我的邏輯在這個方面會如何處理$ q服務。我有一個服務將返回第二個調用已擴展的對象,所以我可以在控制器中使用它來顯示視圖。

第一個API調用返回一些我需要的第二個API調用的參數,以便獲取我將返回給控制器的相關數據。

我將不得不在第一次調用內部進行循環,以便我可以在其中運行第二次API調用,但是我該如何將它返回給我的控制器?當第一個循環已經運行時,我無法解決,因爲好吧,它解釋了它自己。

什麼是這樣的事情的解決方案?

編輯,我的問題在僞的javascript:

returnListOfStuff().then(function (data) { 
    var result = data.Result; 

    for (var i = 0; i < result.length; i++) { 
     var dataForListItem = null; 

     returnDataForListItem(result[i].ID).then(function (data) { 
      dataForListItem = data; 
     }); 

     for (prop in dataForListItem[0]) { 
      result[i].prop = dataForListItem[0][prop]; 
     } 
    } 

    return result; 
}); 

很明顯,這是不行的,認爲它只會從第一個呼叫returnListOfStuff()獲取結果,因爲什麼是內發生的循環尚未解決。我真的不能弄清楚如何做到這一點與$q.all(),因爲我沒有從returnListOfStuff功能尚未

+2

沒有你的代碼,它很難判斷你的問題是什麼,但是這聽起來像是[帶環$ Q承諾(http://stackoverflow.com/q/25671760/1048572) – Bergi

+0

@Bergi的副本添加一些僞代碼來更接近地描述問題... – NicT

回答

1

我真的不能弄清楚如何與$q.all()做到這一點,因爲我沒有參數FR om returnListOfStuff功能尚未

你可以在then回調,你有它們。

您可以返回$q.all從回調中產生的承諾,以獲得承諾支持result的承諾。

returnListOfStuff().then(function (data) { 
    var result = data.Result; 
    return $q.all(result.map(function(resultItem) { 
     return returnDataForListItem(resultItem.ID).then(function (data) { 
      for (prop in data[0]) { 
       resultItem[prop] = data[0][prop]; 
      } 
      return resultItem; 
     }); 
    })); 
}); 
1

嘗試使用$q.all()的參數如下:

var loadQ = []; 
var dataForListItem = null; 
for (var i = 0; i < result.length; i++) { 
    loadQ.push(returnDataForListItem(result[i].ID)); 
} 

$q.all(loadQ).then(function(values){ 
    dataForListItem = values;//or values[0], I dnt known Your data structure; 
}); 

如果你有問題i值,嘗試使用:

for (var i = 0; i < result.length; i++) { 
    (function(e) { 
     loadQ.push(returnDataForListItem(result[e].ID)); 
    })(i); 
} 
+0

我會嘗試做這種方法並報告回來。謝謝,不知道我能做到這一點。 – NicT

+0

@NicT,如果可能,請在您的問題中添加'returnDataForListItem'代碼,以獲得更多專業幫助。 – user3335966

相關問題