【问题标题】:Angular: Generating database information on the flyAngular:动态生成数据库信息
【发布时间】:2017-07-30 12:28:25
【问题描述】:

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

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

这是我的 (mongo) DB 模式,用于作业和条目:

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

【问题讨论】:

    标签: javascript angularjs node.js mongodb database


    【解决方案1】:

    你为什么要链接.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;
    });
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      相关资源
      最近更新 更多