承诺从我的服务返回undefined

时间:2016-04-24 16:06:12

标签: javascript angularjs

我使用websql从web sql

获取数据

我创建了我的控制器,模型和服务:

服务

app.project.service('ProjectService', ['$webSql', 'config', function ($webSql, config) {

    var db = $webSql.openDatabase('MyApp', '1.0', 'MyApp', 2 * 1024 * 1024);

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

    this.create = function (project) {
        return db.insert('projects', project).then(function(results) {
            console.log(results.insertId);
        });
    };

    this.createTable = function () {
        return db.createTable('projects', {
            "id":{
                "type": "INTEGER",
                "null": "NOT NULL", // default is "NULL" (if not defined)
                "primary": true, // primary
                "auto_increment": true // auto increment
            },
            "created":{
                "type": "TIMESTAMP",
                "null": "NOT NULL",
                "default": "CURRENT_TIMESTAMP" // default value
            },
            "name":{
                "type": "TEXT",
                "null": "NOT NULL"
            },
            "path": {
                "type": "TEXT",
                "null": "NOT NULL"
            },
            "file": {
                "type": "TEXT",
                "null": "NOT NULL"
            }
        });
    };

}]);

模型

app.project.factory('Project', function (ProjectService) {

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

        angular.extend(this, properties);
    };

    Project.prototype.setModel = function (obj) {
        angular.extend(this, obj);
    };

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

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

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

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

    return Project;

});

控制器

app.home.controller('HomeController', ['$scope', '$http', '$webSql', 'Project', function ($scope, $http, $webSql, Project) {

    var project = new Project();

    $scope.refresh = function(){

        new_project = {"name": 'Project1 WEB PREPROD', "path": 'project1.preprod.site.com', 'file': '/release.txt'};

        // project.createTable();

        project.create(new_project);

        $scope.projects = project.getAll();

        console.log(project.getAll());
    };

    $scope.refresh();
}]);

我可以创建表并创建一个新对象(项目),但是当我执行$scope.projects = project.getAll();时 我的控制台日志返回undefined

我在我的服务中试过这个

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

但我有同样的问题

1 个答案:

答案 0 :(得分:2)

您错过了从服务getAll方法返回承诺。基本上db.selectAll函数返回一个你没有返回的promise。

this.getAll = function (params) {
    //return promise from here.
    return db.selectAll("projects").then(function(results) {
        for(var i=0; i < results.rows.length; i++){
            projects.push(results.rows.item(i));
        }
        return projects;
    })
};

并替换它:

$scope.projects = project.getAll();

通过

project.getAll().then(function(results) {
    $scope.projects = results;
});