Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 在拦截器之后使用$promise.then()错误地调用successCallback_Angularjs_Ngresource - Fatal编程技术网

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

Angularjs 在拦截器之后使用$promise.then()错误地调用successCallback,angularjs,ngresource,Angularjs,Ngresource,我想在拦截器完成基本的消息处理之后使用$PROMITE.then(successCallback,errorCallback)。不知何故,它总是运行到successCallback,如果我得到错误400401等,它永远不会运行到errorCallback。如果我删除拦截器,它工作正常。我还发现我可以在拦截器中创造一个新的承诺来解决这个问题,但我认为这不是最好的方法。在我的例子中,我只需要一个用于一些基本消息处理的拦截器,然后使用主逻辑在主控制器中继续。这在当前是不可能的,因为如果出现错误,我总是

我想在拦截器完成基本的消息处理之后使用$PROMITE.then(successCallback,errorCallback)。不知何故,它总是运行到successCallback,如果我得到错误400401等,它永远不会运行到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
            }
        );
    }
});

重新抛出错误响应非常重要

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;
            }
        }
    }
});

如果只是返回错误响应,它将被错误地从拒绝转换为成功。

我认为这是一个副本:虽然建议的副本可以工作,但它没有下面接受的答案那么优雅。非常感谢,从“返回”到“抛出”的这一小变化修复了它!