簡體   English   中英

foreach 之后的 AngularJS 承諾

[英]AngularJS promise after foreach

在 foreach 之后我的承諾有問題,

我想從我的數據庫中刪除沒有父對象的對象。

我讀了這篇文章並嘗試了很多東西,例如:

控制器

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

項目.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

到目前為止,您還沒有嘗試使用以下內容更新您的代碼:

// 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 接受一個承諾數組而不是對象,他等不及你填充一個數組,因為他不知道什么標准讓你准備好數組被稱為。

您似乎誤解了如何使用 $q.all。 每次調用project.getOne ,您都不知道結果何時會出現,因為它是異步的。 如果你想使用 $q.all,你應該將所有的project.getOne$q.all(myArray)一個數組和$q.all(myArray) 您的代碼只顯示 [] 是正常的,因為 .then 還沒有被調用,並且當您通過控制台時 push 方法還沒有被調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM