Подтвердить что ты не робот

Angularjs обещает отклонение цепочки

Мне нужно создать цепочку promises:

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, второй then будет разрешен и будет вызван его successCallback. Но если я удалю errorHandler, то второе обещание будет отклонено.

В соответствии с Angular JS docs единственным способом распространения отклонения является возврат $q.reject();, и это выглядит не очевидным, особенно потому, что мне нужно внедрить сервис $q, даже если он не нужен;

Это также можно сделать, выбросив исключение в errorHandler, но он пишет трассировку исключения для консоли, это не хорошо.

Есть ли еще один способ сделать это ясным способом? И в чем причина? Почему это делается? В этом случае может быть полезно текущее поведение?

4b9b3361

Ответ 1

И какова причина, по которой это делается. В этом случае может быть полезно текущее поведение?

Это может быть полезно, когда в 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);

Ответ 2

Поздно к вечеринке, но так как я здесь;

Я предпочитаю использовать ошибку $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);           
        }
    )

}])