代码之家  ›  专栏  ›  技术社区  ›  He Nrik

AngularJS在不同的地方处理不同的错误代码

  •  3
  • He Nrik  · 技术社区  · 13 年前

    我有一个服务,它包含对$http的通用调用,所有ajax调用都使用该调用。在这里,我有“集中”的错误处理,其中状态代码导致重定向。

    “FieldsSync”服务:

    return $http({
        method: 'POST',
        url: url,
        data: $.extend(defaultPostData, postData)
    }).error(function(data, status) {
        switch (status) {
            case 401: // "Unauthorized". Not logged in. 
                redirect.toLoginPage();
                break;
            case 403: // "Forbidden". Role has changed.
                redirect.toLogoutPage();
                break;
        }
    });
    

    当从控制器调用其中一个服务函数时,我总是返回延迟对象,以便能够连接更多的错误回调,从而能够处理应该为用户带来某种反馈的错误。

    控制器:

    fieldsSync.createField(newField).success(function(data) {
        ...
    }).error(function(data, status) {
        switch (status) { // <--- DO NOT WANT
            case 401:
            case 403:
                return; // These errors are handled (=redirects) in the generic error callback and we don't want to show do anything while it redirects.
        }
        ... // "Individual" error handling. =Displaying messages and stuff
    });
    

    但是,因为我不希望在重定向发生之前弹出错误消息,如果状态代码已经被处理,我必须退出错误回调。

    问题是: 我该如何处理控制器中的开关盒? 在处理了特定的错误代码后,是否可以退出错误回调链?或者有可能以一种不那么丑陋的方式来解决这个问题吗?:)

    这对我来说是一个反复出现的问题,我的思维似乎陷入了困境。

    我已经检查了文档,在$http或$q中都找不到任何漂亮的解决方案。

    2 回复  |  直到 13 年前
        1
  •  1
  •   kfis    13 年前

    我建议您使用responseInterceptor来处理这些情况:

    http://docs.angularjs.org/api/ng .$http

    当我和你有同样的“问题”时,我写了以下内容。这只是初稿,但你可以根据自己的需要进行改进

    InternalServerErrorResponseInterceptor = function($q, InternalServerErrorService) {
        return function(promise) {
            return promise.then(function(response) {
                return response;
            }, function(response) {
                if (response.status > 499) {
                    InternalServerErrorService.handleError();
                    return $q.reject(response);
                }
                return $q.reject(response);
            });
        };
    };
    module.factory('InternalServerErrorResponseInterceptor', ['$q', 'InternalServerErrorService', InternalServerErrorResponseInterceptor]);
    module.config(['$httpProvider', function($httpProvider) {
            $httpProvider.responseInterceptors.push('InternalServerErrorResponseInterceptor');
        }]);
    

    现在,您的特定InternalServerErrorService可以按照您希望的方式处理它:)

    当做

        2
  •  0
  •   He Nrik    13 年前

    我想出的一个解决方案是重做同步函数(puh!),这样它们就不会返回延迟的对象。服务内部的函数可以将回调作为参数。然后,我可以在调用之前检查通用错误处理是否已经处理了错误。

    伪代码:

    服务:

    fieldsSync.createField(newField, successCallback, failCallback) {
        ...
        genericErrorHandlerResultingInRedirects()
        if (not 401 || 403) {
            failCallback()
        }
    };
    

    控制器:

    fieldsSync.createField({}, function successCallback(){}, function failCallback(){
        /* Handle errors that should give the user feedback */
    });
    

    其他解决方案非常受欢迎。