2017-09-11 4 views
1

AngularJS $ qサービスを使用して約束チェーン内で所定の継続をチェーン化する必要があるかどうかを制御する条件付きロジックを配置すると、私はそれらを含めるかどうかによって、定義されているか、定義されていないかの機能を持つことができます。

ex。

const maybeDoThis = yesNoMaybeSo ? 
    function (data) { return data; } : 
    undefined 

doSomethingReturningAPromise() 
    .then(doAnotherThing) 
    .then(maybeDoThis) 
    .then(doYetAnotherThing) 

これは$ qサービスを使用して可能ですか?私はdocumentation内の詳細を見つけることができませんでした、そして、それは簡単なサンプル設定を得るために必要な足場のために、それはあまりにも痛みがあるようです。

私は、未定義ではなく、以下のような機能のようなアイデンティティーを使用するのが最善でしょうか?

function identity(value) { return value; } 
+0

はい、AngularはPromises/A +標準を実装しています。 – Bergi

答えて

1

はい、あなたは.then()に未定義またはnullのいずれかを渡すことができ、それが効果的に無視されます。たとえば、次のコードは、「試験」にログアウトされます:あなたは約束を.catch(someFunction)を使用した場合、あなたが実際に使用してきたのでところで

$q.resolve('test') 
    .then(undefined) 
    .then(val => console.log(val)); 

を、これは、.then(null, someFunction)を呼び出すequivilentです

+0

"の呼び出しの等価性.then(null、someFunction)' " ああ、私はそれについて忘れました。ダブルヌルパラメータも同様に動作することを嬉しく思います。 – jpierson

1

短い答えはYESです!これは可能です。あなたが.then(undefined)の角度を付け加えば、騒がしくないだけで何も実行されず、残りのステートメントで続きます。

私は、機能の証明としてクイックjsfiddleを作成しました。デベロッパーコンソールを開いて、さまざまな条件で表示されているログ情報を確認します。

https://jsfiddle.net/dougefresh/ysvfgq3j/

私もここで明確にするためのコードを貼り付けたが、それはフィドルでうまく動作します。

var app = angular.module('myApp', []); 
 

 

 
app.controller('ExampleCtrl', ['$scope', '$log', '$q', function($scope, $log, $q) { 
 
    $scope.maybeDoThis = null; 
 
    $scope.example = function(input) { 
 
    $scope.maybeDoThis = input ? function() { $log.info('conditional function!');} : undefined; 
 
    $log.info('Button pushed'); 
 
    $scope.promise(true) 
 
     .then(function(val) { 
 
     $log.info('first then'); 
 
     }) 
 
     .then($scope.maybeDoThis) 
 
     .then(function(val) { 
 
     $log.info('third then'); 
 
     }) 
 
     .catch(function(val) { 
 
     $log.info('catch!'); 
 
     }); 
 
    }; 
 

 
    $scope.promise = function(answer) { 
 
    $log.info('promise run'); 
 
    var deferred = $q.defer(); 
 
    if (answer) deferred.resolve('TRUE'); 
 
    else deferred.reject('FALSE'); 
 
    return deferred.promise; 
 
    } 
 
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-controller="ExampleCtrl"> 
 
    <button ng-click="example(true)"> 
 
    CLICK ME TO RUN A FUNC 
 
    </button> 
 
    <button ng-click="example(false)"> 
 
    CLICK ME TO RUN UNDEFINED 
 
    </button> 
 

 
</div>

関連する問題