我想知道何时失去互联网连接并重新获得互联网,以便可以在显示“糟糕,没有互联网”的警报和包含从我的服务器派生的数据的Google地图或网格之间切换。
这个相关的问题和另一个相关的问题认为他们有答案,但没有答案。
他们的解决方案适用于Chrome版本34.0.1847.137 m,MS IE v11.0.xx,但不适用于FireFox v29.0.1,因此,我正在寻求一种适用于所有这三种浏览器的解决方案。
[更新] AS @Quad指出了定义在线意味着什么的不同方法。我将其定义为“是否可以获取需要显示给用户的数据?”。
我有几个服务,负责从多个服务器中获取数据(最好是什么?一个参数化的服务?每个服务器一个服务?或者每个服务器每种数据类型一个服务?我在想后者,因为每个服务都可以然后映射到映射视图的控制器。但是我对Angular并不陌生,所以可能是错误的)。
此外,我已经对服务进行了编码,该服务负责在连接断开时尝试重新连接。
尝试使用$http.get并获取404的任何人都可以调用该服务,该服务将: 1)广播没有互联网(以便其他人无法尝试连接) 2)定期尝试连接到我的服务器,以及 3)成功后,停止连接尝试并广播该应用程序现在再次在线。
$http.get
但是,这似乎很笨拙,并且在两个相关问题中提供的解决方案似乎很优雅-除了FF :-(
我不能在这里重新发明轮子。别人怎么做?实际上,令我感到惊讶的是,还没有“官方的” Angular解决方案
我所知道的最好的方法是拦截HTTP处理程序,如果它是401/501 / etc然后根据
例如:
angular.module('myApp', ['myApp.services'], function ($httpProvider) { 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); } }]; $httpProvider.responseInterceptors.push(interceptor);
然后在侦听on的代码中,只需添加
$rootScope.$on("ServerError", someServerErrorFunction);
您还可以添加一个内部标志,并仅在该标志更改时广播。
但是,如果您正在寻找用户与服务器之间的通信不频繁的解决方案,则可以添加一个部分来每分钟左右ping服务器一次,但是可能并没有响应。