在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
答案 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尚未被调用,并且当您通过控制台时尚未调用推送方法。