一尘不染

如何检测在线/离线状态何时更改

angularjs

我想知道何时失去互联网连接并重新获得互联网,以便可以在显示“糟糕,没有互联网”的警报和包含从我的服务器派生的数据的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)成功后,停止连接尝试并广播该应用程序现在再次在线。

但是,这似乎很笨拙,并且在两个相关问题中提供的解决方案似乎很优雅-除了FF :-(

我不能在这里重新发明轮子。别人怎么做?实际上,令我感到惊讶的是,还没有“官方的” Angular解决方案


阅读 230

收藏
2020-07-04

共1个答案

一尘不染

我所知道的最好的方法是拦截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服务器一次,但是可能并没有响应。

2020-07-04