angularjs - Interceptor 错误调用 successCallback 后使用 $promise.then()

标签 angularjs ngresource

我想在拦截器完成基本消息处理后使用 $promise.then(successCallback,errorCallback) 。不知何故,如果我收到错误 400,401 等,它总是会遇到 successCallback 而不会遇到 errorCallback。如果我删除拦截器,它会正常工作。我还发现我可以在拦截器中创建一个新的 promise 来解决这个问题,但我认为这不是最好的方法。就我而言,我只需要一个拦截器来进行一些基本的消息处理,然后在主 Controller 中继续执行主逻辑。目前这是不可能的,因为如果出现错误,我总是会遇到 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;
            }
        }
    }
});

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

关于angularjs - Interceptor 错误调用 successCallback 后使用 $promise.then(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51422173/

相关文章:

angularjs - 单击 Protractor 端到端测试中隐藏元素的方法

javascript - 重定向时 AngularJS 无限循环

javascript - Uncaught Error : [$injector:modulerr] AngularJS

angularjs - 使用 Angular ngResource 自定义 URL

javascript - 全局变换ngResource query()

javascript - 为什么我无法访问 Angular 创建的新 DOM 元素?

javascript - 我怎样才能做出瀑布 Q promise ?

javascript - 如何在指令中将元素推送到数组 - AngularJS

javascript - Angular - 根据 ID FK 链接表中的两个 API 源

angularjs - 如何使用 Angular 的 $resource 发送 POST 登录请求?