Angular选择退出拦截器行为

时间:2014-03-01 18:20:13

标签: angularjs cross-cutting-concerns

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

我打算只使用一个拦截器并让它处理所有错误。像

这样的东西
$httpProvider.interceptors.push(function($q) {
    return { 
        'responseError': function(rejection) {
            displayMessage(rejection);
            return $q.reject(rejection);
        }
    };
});

然后从控制器,如果我打电话

$scope.widget = WidgetResource.get();

并且服务器响应401错误,将向用户显示一条错误消息,指出他们未被授权。

但是我发现有时控制器可能想要自己处理错误响应(即,在给定上下文中显示错误的更好方法)。什么方式它可以选择退出拦截器正在做什么?

或者,也许拦截器不是这样的。还有什么方法可以用来处理这种交叉问题并允许选择退出?

1 个答案:

答案 0 :(得分:1)

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

您可以通过以下方式根据HTTP status codes进行区分:

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将被转发到您各自的控制器或服务的错误处理程序。