2015-01-06 126 views
4

我必須在檢索數據集合後進行順序AJAX調用。我遇到的問題解決了嵌套的承諾。angular.forEach解析嵌套承諾

基本上,我需要擴展我的第一個集合中返回的每個對象,其屬性爲ActionItems,並用承諾設置它的值,然後解析集合中的每個承諾。

任何幫助將不勝感激。

$http.get(urlBase + 'Project?$expand=Plant,CreatedBy,ModifiedBy,Plant/Contacts').then(function(success){ 
     var contents = {}; 
     contents = success.data.d.results; 

     return contents; 
    }) 
    .then(function(contents){ 
     var contentPromises = []; 
     angular.forEach(contents, function(content) { 
      contentPromises.push(
       $http.get(urlBase + "ActionItems?$filter=ProjectId eq " + content.Id).then(function(success){ 
        content['ActionItems'] = success.data.d.results;       
       }) 
      ); 
     }); 
     return $q.all(contentPromises).then(function() { 
      return contents; 
     }); 
    }); 

電流輸出不確定

+0

什麼不處理您的代碼? – devqon

+0

它返回undefined – ExceptionLimeCat

回答

3

那麼原來這種方法可行,但關鍵讓你的數據備份將返回它...

//Forgot the return below... 
return $http.get(urlBase + 'Project?$expand=Plant,CreatedBy,ModifiedBy,Plant/Contacts').then(function(success){ 
    var contents = {}; 
    contents = success.data.d.results; 

    return contents; 
}) 
.then(function(contents){ 
    var contentPromises = []; 
    angular.forEach(contents, function(content) { 
     contentPromises.push(
      $http.get(urlBase + "ActionItems?$filter=ProjectId eq " + content.Id).then(function(success){ 
       content['ActionItems'] = success.data.d.results;       
      }) 
     ); 
    }); 
    return $q.all(contentPromises).then(function() { 
     return contents; 
    }); 
}); 

感謝所有誰幫助。

+0

考慮在內容上使用'.map'。 –

1

您的問題在於在$http.get(...).then()部分內。

The documentation對於.then告訴我們「此方法返回一個新的承諾,通過successCallback,errorCallback的返回值解決或拒絕」。 因此.then返回的承諾與$http.get返回的承諾不同。你有責任解決或拒絕它(通過返回)! .then返回的承諾是推到contentPromises的承諾。

因此你需要的東西是這樣的:

angular.forEach(contents, function(content) { 
    contentPromises.push(
     $http.get(urlBase + "ActionItems?$filter=ProjectId eq " + content.Id).then(function(success){ 
      content['ActionItems'] = success.data.d.results; 
      return success;       
     }) 
    ); 
}); 

你會做的很好落實errorCallback了。