我正在应用中创建离线模式。每当发送http请求时,我都希望拦截器检测网络状态。如果状态没有连接,我想创建一个模拟响应,让它感觉好像响应来自服务器。
答案 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检测特殊情况。