2016-03-22 20 views
1

私はコントローラーを呼び出す前に再帰的なデータ構造を解決したいが、これを行う方法には苦労している。再帰的なデータ構造の約束

私の現在のコードは次のようになります。

region.loadChildren = function() { 
    region.children = []; 
    return region.resource.all('children').getList().then(function(subs) { 
     angular.forEach(subs, function(sub) { 
      sub.loadChildren(); 
      region.children.push(sub); 
     }); 
     }, errorCallback 
    ); 
}; 

私は何とかsub.loadChildrenによって返された約束を()「収集」し、それらを組み合わせることができますか?

答えて

1

の$ q.allはyoureのソリューションです。初期配列を作成して約束を蓄積し、それを実際の作業を行う元の関数の修正版に渡す:

region.loadChildren = function() { 
    var tmp = []; 
    this.loadChildrenHelper(tmp); 
    this.children = tmp; 
} 

region.loadChildrenHelper = function(accum) { 
    return region.resource.all('children').getList().then(function(subs) { 
     angular.forEach(subs, function(sub) { 
      sub.loadChildrenHelper(accum); 
      accum.push(sub); 
     }); 
     }, errorCallback 
    ); 
}; 

、その後は約束のコレクションを統合するために結果の配列

2

はい、あなたは$q.allを使って、約束事を1つの約束事に集めることができます。約束事は、リストの各約束が解決されたときに解決されます。

region.loadChildren = function() { 
    region.children = []; 
    return region.resource.all('children').getList().then(function(subs) { 
     var promises = subs.map(subs, function(sub) { 
      var promise = sub.loadChildren(); 
      region.children.push(sub); 
      return promise; 
     }); 

     var allPromisesInOnePromise = $q.all(promises); // a regular promise which will resolve when all of the promises will resolve 

     }, errorCallback 
    ); 
}; 

あなたはhere- https://docs.angularjs.org/api/ng/service/$q

0

は、あなたがして、あなたの現在の機能を置き換えることができ、ここで約束し、$ q.all関数の詳細を読むことができます -

var promises = [] 
angular.forEach(subs, function(sub) { 
    promises.push(sub.loadChildren()); 
    region.children.push(sub); 
}); 
$q.all(promises).then(function(values) { 
    // Finished 
}) 
1

使用$q.all$q.allを使用してを連鎖ためリターン彼らに確認してください。

region.loadChildren = function() { 
    //return for chaining 
    return region.resource.all('children').getList().then(function(subs) { 
     var children = []; 
     angular.forEach(subs, function(sub) { 
      var p = sub.loadChildren(); 
      children.push(p); 
     }); 
     //return for chaining 
     return $q.all(children); 
    ); 
}; 

約束の.thenメソッドを呼び出すと、新しい派生約束を返すので、約束のチェーンを作成することが容易に可能です。任意の長さのチェーンを作成することは可能であり、約束は別の約束(それ以上解決を延期する)で解決することができるので、チェーンの任意のポイントで約束を一時停止/延期することが可能です。これにより、強力なAPIを実装することが可能になります。詳細については1

AngularJS $q service API Reference -- chaining promises.

$q.allない弾力であることに注意してください参照してください。いずれかの約束が拒否された場合、$q.allは最初のエラーで拒否されたことを解決します。

関連する問題