请求拦截器是否可以在angularJS中创建http响应

时间:2015-04-02 12:02:36

标签: angularjs

我正在应用中创建离线模式。每当发送http请求时,我都希望拦截器检测网络状态。如果状态没有连接,我想创建一个模拟响应,让它感觉好像响应来自服务器。

2 个答案:

答案 0 :(得分:0)

您可以通过阅读拦截器中的响应状态来检查您是否在线,如果它是401/501 /等:

var interceptor = ['$rootScope', '$q', function ($rootScope, $q) {
   function success(response) {
      return response;
   }
   function error(response) {
      var status = response.status; // error code
      if ((status >= 400) && (status < 500)) {
         $rootScope.broadcast("AuthError", status);
         return;
      }
      if ((status >= 500) && (status < 600)) {
         $rootScope.broadcast("ServerError", status);
         return;
      }
      // otherwise
      return $q.reject(response);
   }
   return function (promise) {
      return promise.then(success, error);
   }
}]

还有另外一种方法,使用html5,但我猜不会在某些浏览器上运行。这是使用navigator.onLine属性完成的,如:

if (navigator.onLine) {
  //I'm online
} else {
  I'm not online
}

https://developer.mozilla.org/en-US/docs/Web/API/NavigatorOnLine/onLine

答案 1 :(得分:0)

如果在请求拦截器中抛出一个对象,则会触发对responseError拦截器的调用,并将throwed对象作为其参数传递。

你必须找到一种方法来通知responseError拦截器,这不是一个真正的错误,它应该返回一个自定义响应。

responseError拦截器可以选择恢复返回响应对象的错误o无法返回被拒绝的promise(检查angular的$ http拦截器文档)

编辑:如果从请求拦截器中抛出一个对象,则无法避免在控制台中出现错误消息。最好返回一个被拒绝的promise,它将config对象作为值传递,并在其中放入额外的信息,以便responseError检测特殊情况。