2016-04-26 96 views
0

我的承诺有一个问题,在一个foreach后,AngularJS承诺在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

这是什么'console.log(results)'显示,而不是'console.log($ scope.results);'? –

回答

0

你是不那么远的你试图只需更新你的代码:

// in the foreach 
if(result.ParentId){ 
    var promise = project.getOne(result.ParentId); 
    $scope.result.push(promise); 
    promise.then(function(results) { 
     return results.length ? project:null; 
    } 
} 
// after forEach 
$q.all($scope.results).then(function(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 
}) 

的解释是, $ q.all接受一个不是对象的promise数组,他不能等待你填充一个数组,因为他不知道什么标准使得你的数组“准备就绪”,而不像一个将要调用该解析的promise。

+0

Thx!我更新了我的代码与你的代码,但它不工作..我有一个错误angular.min.js:13550 TypeError:无法读取属性'值'空 在Object.whereClause(angular-websql.js:7 ) 在Object.select(angular-websql.js:7) 在getOne(project.service.js:18) –

+0

我的坏它的promise.then当然不是project.getOne()。那么当它已经完成2行之前。错误的复制/粘贴:x。我编辑了我自己的帖子 – Walfrat

+0

我更新了我的代码,但总是出现同样的错误:x –

0

看来你似乎误解了如何使用$ q.all。 每次您拨打project.getOne时,都不知道结果何时出现,因为它是异步的。 如果你想使用$ q.all,你应该将所有的project.getOne放在一个数组中,并且$q.all(myArray)。您的代码仅显示[]是正常的,因为尚未调用.then,并且在通过控制台时尚未调用推送方法。