我正在尝试构建的应用程序的流程如下:当加载页面时,将从“数据库/作业”中提取作业列表并显示。另外:对于每个作业,将拉出一组与该作业相对应的文档。这些文件中的每一个都有几个小时。 (因为每个作业的总小时数被添加然后显示。每次加载页面时都需要生成每个作业的总小时数,并且不能存储在数据库中。)
目前,变量'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;
};
答案 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响应中抛出一个调试器语句,并确保它正确解析。