在拦截器之后错误地使用$ promise.then()调用successCallback

时间:2018-07-19 12:00:07

标签: angularjs ngresource

我想在拦截器完成基本消息处理后使用$ promise.then(successCallback,errorCallback)。如果我收到错误400,401等信息,它总是以某种方式一直运行到successCallback中,而不会运行到errorCallback中。如果我删除了拦截器,它就可以正常工作。我还发现,我可以在拦截器中创建新的承诺来解决此问题,但我认为这不是最好的方法。在我的情况下,我只想要一个用于某些基本消息处理的拦截器,然后在主控制器中继续使用主逻辑。目前这是不可能的,因为如果遇到错误,我总是会碰到successCallback。 我了解错了吗? 这是我想要的示例:

var resourceObj = $resource("url/abc/:action/:id", {}, {
    getMember: {
        method: 'GET',
        params: { action: 'member' },
        interceptor: {
            responseError: function(response) {
                console.log("Interceptor responseError");
                //Show some default error messages here
                return response; //create new promise with $http(response); to solve the problem? 
            },
            response: function(response) {
                console.log("Interceptor responseSuccess");
                //Show some default success messages here
                return response; //create new promise with $http(response); to solve the problem? 
            }
        }
    }
});
myModule.controller('myCtrl', function($scope) {
    $scope.checkMember() = function(memberId) {
        resourceObj.getMember({ id: memberId }, {}).$promise.then(
            function(responseOK) { //successCallback
                console.log(responseOK);
                $scope.testMember = responseOK.data; // or if no interceptor is used responseOK.toJSON()
                //do some stuff here after async call is finished               
            },
            function(responseError) { //errorCallback, never called in error case if an interceptor is used. 
                console.log(responseError);
                //do maybe some advanced error handling here after async call is finished
            }
        );
    }
});

1 个答案:

答案 0 :(得分:2)

重新抛出错误响应很重要。

var resourceObj = $resource("url/abc/:action/:id", {}, {
    getMember: {
        method: 'GET',
        params: { action: 'member' },
        interceptor: {
            responseError: function(response) {
                console.log("Interceptor responseError");
                //Show some default error messages here
                ̶r̶e̶t̶u̶r̶n̶ ̶r̶e̶s̶p̶o̶n̶s̶e̶;̶
                //IMPORTANT re-throw error response
                throw response;
            },
            response: function(response) {
                console.log("Interceptor responseSuccess");
                //Show some default success messages here
                return response;
            }
        }
    }
});

如果仅返回错误响应,则会错误地将其转换为,从拒绝到成功。