Отклонить "ответ" в "responseError"

Иногда API, который я использую, возвращает 200 ok, хотя произошла ошибка. Объект ответа JSON будет выглядеть примерно так:

{
    error: true
}

Я построил перехватчик $http response, который просто проверяет эту ошибку и отклоняет ее. Я хочу, чтобы он прыгнул в мою функцию responseError:

$httpProvider.interceptors.push(function($q) {
    return {

        response: function (response) {

            if (response.data.error) {

                // There has been an error, reject this response
                return $q.reject(response);
            }

            return response;
        },

        responseError: function(rejection) {

            // Display an error message to the user
            ...

            return $q.reject(rejection);
        }
    }
});

Проблема в том, что даже после отклонения ответа моя функция responseError не вызывается. Он вызывается при ошибках 500 и т.д., Поэтому я знаю, что он работает. Я ожидаю, что отказ будет делать то же самое.

Из docs:

responseError: interceptor gets called when a previous interceptor threw an error or resolved with a rejection.

Любые идеи о том, что не хватает?

Ответы

Ответ 1

Похоже, это невозможно сделать. Чтобы сократить дублирующийся код, просто объявите функцию обработки ошибок отдельно и повторно используйте ее в функциях ответа и ответаError.

$httpProvider.interceptors.push(function($q) {

    var handleError = function (rejection) { ... }

    return {

        response: function (response) {

            if (response.data.error) {
                return handleError(response);
            }

            return response;
        },

        responseError: handleError
    }
});

Ответ 2

Чтобы добавить к этому ответу: отклонение обещания в ответном перехватчике делает что-то.

Хотя можно было бы ожидать, что он вызовет responseError с первого взгляда, это не будет иметь большого смысла: запрос выполняется с помощью succes. Но отклонение его в ответном перехватчике заставит вызывающего лица обещать пойти на обработку ошибок. Поэтому, делая это

$http.get('some_url')
.then(succes)
.catch(err)

Отклонение обещания вызовет функцию catch. Таким образом, у вас нет правильной общей обработки ошибок, но ваше обещание отклонено, и это полезно: -)

Ответ 3

Если вы хотите передать HTTP-ответ обработчику responseError, вы можете сделать это следующим образом:

$httpProvider.interceptors.push(function($q) {

    var self = {

        response: function (response) {

            if (response.data.error) {
                return self.responseError(response);
            }

            return response;
        },

        responseError: function(response) {
            // ... do things with the response
        }
    }
    return self;
});