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

иногда API, который я использую, возвращает там была ошибка. Объект ответа 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.

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

3 ответов


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

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

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

    return {

        response: function (response) {

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

            return response;
        },

        responseError: handleError
    }
});

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

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

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

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


Если вы хотите передать 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;
});