Angularjs 拦截器的角度选择退出行为

Angularjs 拦截器的角度选择退出行为,angularjs,cross-cutting-concerns,Angularjs,Cross Cutting Concerns,在我的angular应用程序中,我正在寻找一种处理所有服务器响应错误的方法(带有一个显示错误消息的弹出框),但允许控制器选择退出此行为,并在调用$resource时根据需要自行处理错误 我计划只使用拦截器,让它处理所有错误。差不多 $httpProvider.interceptors.push(function($q) { return { 'responseError': function(rejection) { displayMessage

在我的angular应用程序中,我正在寻找一种处理所有服务器响应错误的方法(带有一个显示错误消息的弹出框),但允许控制器选择退出此行为,并在调用$resource时根据需要自行处理错误

我计划只使用拦截器,让它处理所有错误。差不多

$httpProvider.interceptors.push(function($q) {
    return { 
        'responseError': function(rejection) {
            displayMessage(rejection);
            return $q.reject(rejection);
        }
    };
});
然后从控制器那里,如果我打电话

$scope.widget = WidgetResource.get();
当服务器响应401错误时,将向用户显示一条错误消息,说明他们未经授权

但我突然想到,有时控制器可能希望自己处理错误响应(即,在给定上下文中显示错误的更好方法)。什么样的方式可以让它选择退出拦截器正在做的事情


或者,拦截器可能不是解决这个问题的方法。我还可以用什么来处理这个横切问题并允许选择退出?

您可以使用拦截器来处理不特定于上下文的错误。我们发现这实际上是一种很好的做法。会话超时(401)或内部服务器错误(500)之类的错误可以由拦截器处理。而上下文特定的错误在各自的服务回调中处理得更好

您可以根据以下方式进行区分:

function responseError(rejection) {
        switch (rejection.status) {
          case 401:
            //handle unauthenticated request
          case 500:
            //Oops something has gone wrong due to an internal server error
          default:
            break;
        }
        return $q.reject(rejection);
      }

$q.reject(rejection)
时,控件被转发到相应的$resource实例的错误处理程序。因此,在上面的示例中,来自服务器的404将被转发到您各自的控制器或服务的错误处理程序。

我明白您的意思,即让理解上下文的代码来处理特定于上下文的错误。我会考虑的。我真正想解决的问题是确保每次使用$resource时不会重复相同的错误处理代码(将消息显示给用户)。如果将其放入拦截器,就不会重复。对吗?例如,对于未经身份验证的用户,您可以在拦截器本身的某个共享服务中设置错误消息。对,因此更好的示例是,99%的时间服务器返回400个错误请求,无论错误消息是什么,我都会显示相同的弹出窗口,但是有1%的时间我不希望出现错误的弹出窗口-我希望内联显示它。控制器有没有办法说“嘿,拦截器,忽略我正在打的电话”或类似的话。如果我在java中使用aspectj,我会截取一个注释,说“截取所有资源调用,除非它有@DontSplayme注释。”我意识到这个问题由来已久,但你找到了一个很好的策略吗?我有一个类似的需求(在Angular 12中)来区分拦截器中的一些请求。在AngularJS中没有方法,但在AngularJS中,可以使用装饰器。这不是小事,所以我不能在这里给出完整的解释,但是我们创建了一个
@ErrorPopup
装饰器,当返回rxjs observer的包装方法抛出错误时,它将显示一个弹出错误。所以这实际上是一种选择加入而不是选择退出的策略。但它仍然具有不必手动处理代码中任何地方的错误的优点。@Superole您还可以向http请求添加元数据,并让拦截器拾取该元数据并跳过正常的错误处理逻辑。