2016-08-05 6 views
2

現在、複数の約束事すべてがブール値を返すように動作するAngularJSコントローラに取り組んでいます。このブール値に基づいて、結果として生じるブール値が決定される。戻り値がすべてtrueの場合も結果はtrueになりますが、1つの約束がfalseを返す場合でも、結果はfalseになります。現在、すべてのサービス/ DAOコールが連鎖しているため、1つの約束が拒否されると問題が発生します。私はこのような状況にどう対処するかが良い方法だと思います。AngularJSは複数の約束を処理します

コントローラコード:

app.controller('PromiseController', ['$scope', 'FirstService', 'SecondService', 'ThirdService', 
    'FourthService', function ($scope, FirstService, SecondService, ThirdService, FourthService) { 

    var vm = this; 

    vm.statusResult = false; 
    vm.statusSecond = null; 
    vm.statusThird = null; 
    vm.statusFourth = null; 
    vm.statusFirst = null; 

    SecondService.getStatus()  
    .then(function(returnData){ 
     vm.statusSecond = returnData; 
    }) 
    .then(function(){ 
     return ThirdService.getStatus(); 
    }) 
    .then(function(returnData){ 
     vm.statusThird = returnData; 
    }) 
    .then(function(){ 
     return FourthService.getStatus(); 
    }) 
    .then(function(returnData){ 
     vm.statusFourth = returnData; 
    }) 
    .then(function(){ 
     return FirstService.getStatus(); 
    }) 
    .then(function(returnData){ 
     vm.statusFirst = returnData; 
    }) 
    .then(function(){ 
     if(vm.statusThird&&vm.statusFourth&&vm.statusFirst&&vm.statusSecond){ 
      vm.statusResult = true; 
     } 

    }); 

    return this; 

}]); 

は、だから私は、複数の約束とどのようにすべての約束の最終結果を解決するためにどのように対処するより良い方法を探しています。また、結果を処理している間、アプリはフリーズするべきではありません。


EDIT

@str から$q.allとソリューションは、最終的な結果のために正常に動作しますが、私はまた、すべてのサービスの個々の結果を必要としています。最終結果を処理しながら単一の値を処理することはできますか?

+0

はサービスが並行して実行することはできますか? – str

+0

'$ q.all'または' Promise.all'はこれらの約束をすべて平行して実行し、その結果の配列を与えることができます。 – ste2425

+0

私はあなたの関数に成功とエラーのブロックである2つのコールバックを渡すことができると思います。両方の関数では、次の約束オブジェクトを返し、拒否された約束の状態を変数に保存して、このような実行は停止しません。 – Nirus

答えて

7

あなたはすべての約束を待つ$q.allを使用することができます。

var promises = [ 
    FirstService.getStatus(), 
    SecondService.getStatus(), 
    ThirdService.getStatus(), 
    FourthService.getStatus(), 
]; 

$q.all(promises) 
    .then(function (serviceResults) { 
     vm.serviceResults = serviceResults; // result of first promise will be available in vm.serviceResults[0] 
     vm.statusResult = serviceResults.every(function (serviceResult) { 
      return serviceResult; 
     }); 
    }) 
    .catch(function() { 
     vm.statusResult = false; 
    }); 
+0

これは非常にうまく見えますが、私は質問があります:サービスが' true'、 'true'、' false'、 'true'最後の 'true'は' vm.statusResult = serviceResults.every(function(serviceResult){ return serviceResult; })という行のために 'false'値を上書きしません。 – JohnDizzle

+1

少なくとも1つのserviceResultがfalseの場合、serviceResults.everyはfalseを返します。だから、それは上書きされません。すべての値が真を返すべきことを意味します。 –

+1

@JohnDizzleいいえ、oliv37が書いたとおりです。 'serviceResults'は約束からのすべての結果を保持する配列です(例えば' [true、true、false、true] ')。また、 'every'関数は、* every *の値がtrueの場合にのみtrueを返します。 – str