2015-01-06 256 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了。