Angular:动态生成数据库信息

时间:2016-05-21 04:38:44

标签: javascript angularjs node.js mongodb database

我正在尝试构建的应用程序的流程如下:当加载页面时,将从“数据库/作业”中提取作业列表并显示。另外:对于每个作业,将拉出一组与该作业相对应的文档。这些文件中的每一个都有几个小时。 (因为每个作业的总小时数被添加然后显示。每次加载页面时都需要生成每个作业的总小时数,并且不能存储在数据库中。)

目前,变量'totalHours'正被解析为空对象({})。我相信(希望)我的问题是承诺错误。

这是作业和条目的我的(mongo)数据库模式:

var jobSchema = new mongoose.Schema({
    name: String,
    expectedHours: Number,
    startDate: {type: Date, default: Date.now},
    active: Boolean
});

var entrySchema = new mongoose.Schema({
    job: String,
    code: String,
    hours: Number,
    worker: String,
    date: {type: Date, default: Date.now}
});

以下是我正在使用的代码:

$http({
        method: 'GET',
        url: 'database/jobs'
    }).then(function success(response) {
        $scope.activeJobs = response.data;

        for(var i=0;i<$scope.activeJobs.length;i++){
            $scope.activeJobs[i].totalHours = getTotalHours($scope.activeJobs[i].name);
        }
    }).then(function error(response) {
        $scope.activeJobs = response.statusText;
    });
var getTotalHours = function(name){

        var deferred = $q.defer();
        var count = 0;
        $http.get('database/entries/' + name)
            .success(function(response){
                // ? is this for loop asynchronous?
                // Is resolve() getting called before the loop finishes?
                for(var i=0;i<response.data.length;i++){
                    count += response.data[i].hours;
                }
                deferred.resolve(count);
            }).error(function(response){
               deferred.reject({message:'error?'});
            });
        return deferred.promise;
    };

1 个答案:

答案 0 :(得分:0)

为什么要将.then来电链接到http? .then的结果不是承诺。我想你的意思是:

$http({
    method: 'GET',
    url: 'database/jobs'
}).then(function success(response) {
    $scope.activeJobs = response.data;

    for(var i=0;i<$scope.activeJobs.length;i++){
        $scope.activeJobs[i].totalHours = getTotalHours($scope.activeJobs[i].name);
    }
}, function error(response) {
    $scope.activeJobs = response.statusText;
});

那是我的猜测。 count不是异步的。如果这不起作用,则在第二个.success响应中抛出一个调试器语句,并确保它正确解析。