AngularJS承诺在foreach之后

时间:2016-04-26 12:40:13

标签: javascript angularjs angular-promise

在foreach之后,我的承诺存在问题,

我想从我的数据库中删除没有父项的对象。

我读了这个post,我尝试了很多东西,例如:

控制器

project.getAll().then(function(results) {
            return $scope.array_projects = results;
        }).then(function(array_projects) {
            $scope.results = [];
            console.log(array_projects);

            angular.forEach(array_projects, function(result) {
                console.log(result);

                var project = new Project(result);

                var promise = project.getOne(result.ParentId);
                $scope.result.push(promise);
                promise.then(function(results) {
                    return results.length ? project:null;
                });

                // if(result.ParentId !== null) {
                //     console.log('ParentId');
                //     var promise = project.getOne(result.ParentId).then(function(results) {
                //         //console.log(results);
                //
                //         if (results.length === 0){
                //             console.log('remove children');
                //         } else {
                //             $scope.results.push(project);
                //             console.log('parent exist, children added!');
                //
                //         }
                //
                //     });
                //
                // }

            });

            // after forEach
            $q.all($scope.results).then(function(results){
                console.log($scope.results);
                // result is an array of mixed Project object or null value, just remove the null value and you're fine :)
                var trueResults = [];
                for(var i = 0; i < results.length; i++){
                    if(results[i]){
                        trueResults.push(results[i]);
                    }
                }
                // now use trueResults
                console.log(trueResults);
            })

        });

模型

var Project = function (properties) {
        // Model
        this.description = null;
        this.file        = null;
        this.name        = null;
        this.ParentId    = null;
        this.path        = null;

        angular.extend(this, properties);
    };

// With service
// ------------------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------------

Project.prototype.getAll = function () {
    return ProjectService.getAll();
};

Project.prototype.getOne = function (id) {
    return ProjectService.getOne(id);
};

project.service.js

this.getAll = function (params) {
    var projects = [];
    return db.selectAll('projects').then(function(results) {
        for(var i=0; i < results.rows.length; i++){
            projects.push(results.rows.item(i));
        }
        return projects;
    });
};

this.getOne = function (id) {
    var project = [];
    console.log(id);
    return db.select('projects', {
        "id": id
    }).then(function(results) {
        for(i=0; i < results.rows.length; i++){
            project.push(results.rows.item(i));
        }
        return project;
    })
};

但是我的console.log($ scope.results);显示'[]'

在我的BDD中我有:

id/id/ParentId/name/file/date

5   5       test    crm-site.net    /release.txt    2016-04-26 08:43:17

6   6   5   test2   crm-site.net    /release.txt    2016-04-26 08:43:19

7   7       test3   crm-site.net    /release.txt    2016-04-26 08:43:20

8   8   7   test4   crm-site.net    /release.txt    2016-04-26 08:43:21

2 个答案:

答案 0 :(得分:0)

到目前为止,您还没有尝试更新代码:

  synchronized(this){
//my compilation, running and analysis part is here
}

解释是$ q.all采取一系列承诺而不是对象,他不能等你填充一个阵列,因为他不知道什么标准会让你重新排列阵列#34;准备&#34;不同于将要求决心的承诺。

答案 1 :(得分:0)

好像你误解了如何使用$ q.all。 每次拨打project.getOne时,您都不知道结果何时会出现,因为它是异常的。 如果你想使用$ q.all,你应该推送数组中的所有project.getOne$q.all(myArray)。您的代码只显示[]是正常的,因为.then尚未被调用,并且当您通过控制台时尚未调用推送方法。