拦截Angular $ http中的服务器错误并拒绝承诺

时间:2016-03-31 22:39:40

标签: javascript angularjs promise

我使用Angular HTTP服务并拦截来自服务器的响应以捕获任何服务器错误并在拒绝承诺之前对它们执行一些操作(记录等)。

顺便说一下,即使状态代码为200,我有时也会在回复正文中回复验证错误。我知道这并不理想,但请不要挂断因为它不是我问题的原因。我以为我提到它虽然它解释了我为什么拦截响应和responseError

$httpProvider.interceptors.push(function($log, $rootScope, $q) {

    return {
        response: function(response) {

            if (response.data && response.data.success === false) {
                doSomeStuff(response);
                return $q.reject(response);
            }
            else{
                return response;
            }

        },
        responseError: function(rejection) {
            doSomeStuff(rejection);
            $q.reject(rejection);
        }

    };

});

然后,我的应用中的典型HTTP调用可能如下所示。

$http.post('https://domain.com/api/whatever', data).then(function (response) {
    console.log("Don't do this when an error is returned")
});

不幸的是,即使出现HTTP错误,也会运行console.log,或者带有嵌入错误的200状态。

我确定我只是误解了$ http / $ q如何在这里工作,而且有人能够让我直截了当。

1 个答案:

答案 0 :(得分:1)

$q.reject(rejection);

返回一个新拒绝的承诺,它不会影响现有承诺的状态。事实上,responseError所做的所有操作都会捕获拒绝并返回undefined响应。

应该是

    responseError: function(rejection) {
        doSomeStuff(rejection);
        return $q.reject(rejection);
    }