web-dev-qa-db-ja.com

Angularjsは拒否連鎖を約束します

連鎖プロミスを作成する必要があります。

_var deferred = $q.defer();
$timeout(function() {
    deferred.reject({result: 'errror'});
}, 3000);
deferred.promise.then(angular.noop, function errorHandler(result) {
    //some actions
    return result;
}).then(function successCallback(result) {
    console.log('what do I do here?');
    return result;
}, function errorCallback(result) {
   $scope.result= result;
   return result;
});
_

ErrorCallbackを最初のthenに入れると、2番目のthenが解決され、そのsuccessCallbackが呼び出されます。しかし、errorHandlerを削除すると、2番目のプロミスは拒否されます。

Angular JS docsによると、拒否を伝播する唯一の方法は$q.reject();を返すことであり、特に_$q_サービスを注入する必要があるため必要ありません。

errorHandlerに例外をスローすることでも実行できますが、例外トレースをコンソールに書き込みますが、良くありません。

これを明確に行う別のオプションはありますか?そしてその理由は何ですか?なぜそれが行われるのですか?どちらの場合、現在の動作が役立ちますか?

29
just-boris

そして、なぜそれが行われるのか。どちらの場合、現在の動作が役立ちますか?

ErrorHandlerでエラー状態を修復し、何らかの方法でプロミスを解決できる場合に役立ちます。

var retriesCount = 0;

function doWork()
{
    return $http.post('url')
        .then(function(response){
            // check success-property of returned data
            if(response.data.success)
                // just unwrap data from response, may be do some other manipulations
                return response.data;
            else
                // reject with error
                return $q.reject('some error occured');
        })
        .catch(function(reason){
            if(retriesCount++ < 3)
                // some error, let me try to recover myself once again
                return doWork();
            else
                // mission failed... finally reject
                return $q.reject(reason);
        });
}


doWork().then(console.log, console.error);
68
ant

パーティーに遅れましたが、私はここにいます。

$httpおよび応答のエラーステータスを介して成功を返すのではなく、ネイティブエラー処理に200エラーを使用することを好みます。

コンソールで400または500エラーを印刷することは問題ではありません。デバッグしている場合、そうでない場合は表示されます。

angular.module('workModule', [])

// work provider handles all api calls to get work
.service('workProvider', ['$http', '$q', function($http, $q) {

    var endpoint = '/api/v1/work/';

    this.Get = function(){
        // return the promise, and use 404, 500, etc for errors on the server
        return $http.get(endpoint);
    };

}])

.controller('workController', ['workProvider', function('workProvider'){

    workProvider.Get().then(
        function(response){ // success
            console.log(response.data);
        },
        function(response){ // error
             console.log(response.data);           
        }
    )

}])
5
Matthew.Lothian