angular.forEach解析嵌套的Promises

时间:2015-01-06 14:51:28

标签: javascript angularjs promise angular-promise

我必须在检索数据集合后进行顺序AJAX调用。我有解决嵌套承诺的问题。

基本上,我需要扩展第一个集合中返回的每个对象,其属性为ActionItems,并使用promise设置它的值,然后解析集合中的每个promise。

非常感谢任何帮助。

工厂

$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;
        });
    });

当前输出未定义

2 个答案:

答案 0 :(得分: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;
    });
});

感谢所有帮助过的人。

答案 1 :(得分:1)

您的问题在$http.get(...).then()部分。

.then的{​​p> The documentation告诉我们“此方法返回一个新的promise,它通过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