-2

皆さん..

プログラムの開始時に、約 8 つの異なるリソースからデータを取得する必要があります。

これらのリソースは互いに独立しており、並列に呼び出すことができます。(つまり、別のリソースから何を取得するかを決定するために、あるリソースからのデータは必要ありません)

ただし、すべてのリソースは相互に作用するため、すべてのリソースからすべてのデータを手元に持っていることを確認する必要があります。

したがって、コントローラーの先頭で、次のコードで init 関数を呼び出します。

*編集より具体的には、私の正確なコードは次のとおりです

$scope.init = function () {
    return $q.all([
    Factory1.getCarData.query(), // returns a resource object like [$resolved: false, $then: function]
    Factory2.getOtherData.query(), // returns a resource object like [$resolved: false, $then: function] 
    Factory3.getSomeOtherData.query() // returns a resource object like [$resolved: false, $then: function]
    ....,
    resource8.query()]).then(result) {
        $scope.data1 = result[1];
        $scope.data2 = result1[2];...
        $scope.data8 = result[3];

        console.log($scope.data1); //prints as [$resolved: false, $then: function]
        console.log($scope.data1[1]);
        prints as undefined

        doSomethingonData1($scope.data2);
        doSomethingonData2($scope.data3, $scope.data4);..etc etc
    }
}

ここで、Factory1 は次のように定義されています。

angular.module('app').factory('Factory1', function (Factory1Resource)  {    
   var carPromise = Factory1Resource.query(); 
    return {
      getCarData: function(){ return carPromise;}
    }

Factory1Resource は次のように定義されます。

.factory('Factory1Resource', ['$resource', function($resource) {
    return $resource(myURL, {}, {} );
  }])

ファクトリを使用することの要点は、8 つのリソースすべてのデータ操作がコントローラの外部の個々のユニットで確実に行われるようにすることです。

私のポイントは..「.then」関数は、すべてのリソースが解決された後にのみ呼び出されると考えていました。これは、変数 $scope.data1、$scope.data2 などに実際のデータが必要であり、リソース オブジェクトではないことを意味します。

これは、console.log($scope.data1) を実行する場合とは異なります.. [$resolved: false, $then: function] として出力されます。

これは私のプログラムの流れを壊します。

今、私は約束とリソースについて多くのことを読んだと思っていました。

私が望むのは、私の変数 ($scope.data1、$scope.data2 など) すべてに実際のデータが含まれていることです。

ヒントはありますか?または、コードをどのようにレイアウトするべきかについて、より良いアイデアを自由に提案してください。

4

3 に答える 3

0

then()関数を取る、このようにする

.then(function(result) {
    $scope.data1 = result[1];
    ...
});

あなたのためにデモを作成し、コードを少し単純化しました。それは正常に動作します。Demo

于 2013-09-06T16:14:50.530 に答える
0

@sza ここでのアドバイスとヘルプに感謝します。これは正しい方法のようですが、フールプルーフシステムを導入するために、以下を実行しました。

".then"all のセクションにフラグを設定しFactory.getData.query()ます。コードは次のようになります。

Factory1.getCarData.query().then(function(){Data1Retrieved == true}) 

この後、すべてのフラグを監視し、すべてのフラグが true になったら、残りの処理を開始します。繰り返しますが、これが正しい方法かどうかはわかりませんが、確かに効果的であるようです.

皆様、再度のご応募ありがとうございました。

于 2013-09-07T17:06:47.380 に答える
-1

resource.queryから返されたオブジェクトを直接渡す代わりに、 を渡す$q.all(必要がありresource.query().$promiseます。

angular $resource ドキュメントによると

Resource インスタンスとコレクションには、次の追加のプロパティがあります。

$promise: このインスタンスまたはコレクションを作成した元のサーバー インタラクションの約束。

http://docs.angularjs.org/api/ngResource .$resource

アップデート

私が開発した既存のアプリを使用して、自分でテストを作成することにしました。私のために働いたコードを貼り付けます。リソースを呼び出すときは、別の構造になっている可能性があります。

 $provide.factory('GenericResource', ['$resource','$q', function($resource,$q){
        var AccountResource = $resource('/user/accounts/balances'),
            BankResource = $resource('/banks');

        $q.all([AccountResource.query().$promise, BankResource.query().$promise]).then(function(data){
            console.log(data);
        });
    }]);

console.log の出力は次のとおりです。

[
Array[3]
    0: Resource
    1: Resource
    2: Resource
    $promise: Object
    $resolved: true
    length: 3
    __proto__: Array[0]
, 
    Array[4]
    0: Resource
    1: Resource
    2: Resource
    3: Resource
    $promise: Object
    $resolved: true
    length: 4
    __proto__: Array[0]
]

ご覧のとおり、返されたデータには、フェッチされたデータを表す 3 つと 4 つのリソース オブジェクトが含まれていました。この結果はあなたの結果と似ていますか?

于 2013-09-06T14:30:20.413 に答える