2014-03-01 84 views
1

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

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

$httpProvider.interceptors.push(function($q) { 
    return { 
     'responseError': function(rejection) { 
      displayMessage(rejection); 
      return $q.reject(rejection); 
     } 
    }; 
}); 

然后从控制器,如果我叫

$scope.widget = WidgetResource.get(); 

和服务器401错误响应的东西,用户将显示一条错误消息说,他们没有被授权。

但我想到有时控制器可能想要处理它自己的错误响应(即在给定的上下文中显示错误的更好方法)。什么样的方式可以选择离开拦截器?

另外,也许拦截器是不是这样做的方式。我还有什么可以用来处理这种横切关注并允许选择退出?

回答

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)控制被转发到相应的$资源实例的错误处理程序。所以在上面的例子中,来自服务器的404将被转发到您的相应控制器或服务的错误处理程序。

+0

我明白你在说什么,让上下文特定的错误被理解上下文的代码处理。我会考虑这一点。我真正想要解决的问题是,确保每次使用$资源时都不重复相同的错误处理代码(向用户显示消息)。 – Planky

+0

如果你把它放在拦截器中,你就不会重复。对?例如。在未经身份验证的用户的情况下,您可以在拦截器本身的某个共享服务中设置错误消息。 – manan

+0

没错,所以一个更好的例子是服务器返回400个错误请求的时间为99%,我显示与错误消息相同的弹出窗口,但是1%的时间我不想弹出错误 - 我想以内联方式显示它。有没有一种方法让控制器说出“嘿拦截器,忽略我正在做的这个调用”,或者是这个效果。如果我在java中使用aspectj,我会截取一个注释来说,“截取所有的资源调用,除非它有一个@DontDisplayMe注解”。 – Planky