2016-04-26 11 views
0

私はforeachの後に私の約束に問題がありますforeachの後の約束

私のデータベースから親を持っていないオブジェクトを削除したいと思います。

私はこのpostを読んで、私はこのexempleのために、多くのことを試してみました:

コントローラ

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($ scope.results);ではなく、' console.log(結果) 'に何が表示されましたか? –

答えて

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はオブジェクトではなく約束の配列を取るので、配列を埋めるのを待つことはできません。なぜなら、解決が呼び出される約束とは違って、あなたがどのような基準で配列「準備ができているか」を知ることができないからです。

+0

Thx!あなたのコードで私のコードを更新しましたが、動作しません。エラーが発生しました。angular.min.js:13550 TypeError:nullのプロパティ 'value'を読み取れません。 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がまだ呼び出されておらず、コンソールを通過するときにpushメソッドがまだ呼び出されていないため、コードは[]のみを表示するのが普通です。