30

チェーンされたプロミスを作成する必要があります:

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、コンソールに例外トレースを書き込むので、良くありません。

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

4

2 に答える 2

68

そして、それが行われる理由は何ですか。どのような場合に、現在の動作が役立つでしょうか?

errorHandler でエラー状態を修復し、promise を解決しようとする場合に役立ちます。

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);
于 2013-10-16T09:59:57.600 に答える
5

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

応答で成功を返し、エラーステータスを$http返すよりも、エラーをネイティブエラー処理に使用することを好みます。200

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

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);           
        }
    )

}])
于 2014-12-30T06:20:39.367 に答える