0

データベースからフェッチされたデータ配列に依存する関数を実行するために、Angular Promise を使用しています。

以下のように、解決と約束を使用してそれを行いました。

function Mainctrl($q,MyService){
    var defer=$q.defer();
    defer.promise
    //The data im receiving in promise is from the resolve "MyService.getAll({ID :ID})"
        .then(function(data){
            $scope.mydata=data;
            $scope.mylength=$scope.mydata.length;
            console.log();
        });
    //This code MyService.getAll({ID :ID}) returns an array from the database, i am using that result array in promise as "data"
    defer.resolve(MyService.getAll({ID :ID}));
}

問題は、データ配列が設定される前に promise が実行され、長さが常に 0 として表示されることです。ただし、promise の代わりにタイムアウトを使用すると、データ配列が設定され、長さが正しく表示されます。

MyFactory メソッド getAll は

app.factory("MyService", function($resource, $http) {
  var resource = $resource("/rest/:ID ", { ID : "@_ID " },
    {
      'create':  { method: 'POST' },
      'getAll':   { method: 'GET', isArray: true },
      'get':    { method: 'GET', isArray: false },
      'update':  { method: 'PUT' },
      'destroy': { method: 'DELETE' }
    }
  );
  return resource;
});
4

2 に答える 2

4

あなたが何をしたかはわかりませんが、コントローラーは defer\promise オブジェクトを作成する必要はありません。

コードは次の行である必要があります

function Mainctrl($scope,MyService){
        MyService.getAll({ID :ID}).then(function(data){
            $scope.mydata=data;
            $scope.mylength=$scope.mydata.length;
            console.log();
        });
}

更新 サービスは約束を返していないため、呼び出しgetAllは約束を返しませんが、後で埋められる配列を返します。

function Mainctrl($scope,MyService){
            MyService.getAll({ID :ID},function(data){
                $scope.mydata=data;
                $scope.mylength=$scope.mydata.length;
                console.log();
            });
    }
于 2013-10-10T11:21:14.437 に答える
1

docs.angularjs.org/api/ngResource.$resourceによると、getAllメソッドは空の配列を返します。この配列は、値が到着したときに非同期的に値が入力されます。醜いデザイン。

function Mainctrl($scope,MyService){
    MyService.getAll({ID :ID}).$promise.then(function(data){
        $scope.mydata = data;
        $scope.mylength = data.length;
    });
}
于 2013-10-10T11:42:22.560 に答える