Javascript 捕获“;没有互联网连接“;在AngularJS

Javascript 捕获“;没有互联网连接“;在AngularJS,javascript,angularjs,Javascript,Angularjs,我希望我的AngularJS应用程序能够捕获“无互联网连接”,就像Chrome捕获它一样。当Chrome捕捉到它时,它会在console.log上显示net::ERR_INTERNET_DISCONNECTED Angular的HTTP侦听器无法捕获它。我得到的唯一数据是 拒绝。数据。状态未定义 rejection.status 0一个简单的脚本可以帮助您,您可以用不同的方式来完成,甚至可以在失败时加载图像并调用函数 function getNetworkStatus(callback, tim

我希望我的AngularJS应用程序能够捕获“无互联网连接”,就像Chrome捕获它一样。当Chrome捕捉到它时,它会在console.log上显示net::ERR_INTERNET_DISCONNECTED

Angular的HTTP侦听器无法捕获它。我得到的唯一数据是 拒绝。数据。状态未定义
rejection.status 0

一个简单的脚本可以帮助您,您可以用不同的方式来完成,甚至可以在失败时加载图像并调用函数

function getNetworkStatus(callback, timeout, x){
    x = new XMLHttpRequest(); 
    x.timeout = timeout,
    x.onreadystatechange = function(){
        x.readyState == 4 && callback(x.status == 200)
    }, x.onerror = function(e){
        callback(!1)
    }, x.ontimeout = function(){
        callback(!1)
    }, (x.open("GET", "http://ip-api.com/json/"), x.send());
}

getNetworkStatus(function(isOnline){
    console.info(isOnline ? "ONLINE" : "OFFLINE");
},60000);
更新 我们在httpProvider中定义了这个拦截器,所以当调用没有成功发生时,严格地返回一个错误

angular.module('MyApp', []).config([
  '$httpProvider',
  function($httpProvider) {
    $httpProvider.interceptors.push([
      '$q',
      function($q) {
        return {
            responseError: function(res){
                console.info("Failed to open url: " + res.config.url, res);
                //Angular returns "success" by default, but we will call "error" if data were not obtained.
                if(res.data == null && res.status === 0 && res.statusText === ""){
                    return $q.reject(res) //callback error()
                }       
                return res //return default success()
            }
        };

      }
    ]);
  }
]).run(['$http', function($http) { // --TEST--
    //$http.get("http://ip-api.com/json/").success(function(){ //page online
    $http.get("https://ip-api.com/json/").success(function(){ //try "https" (page offline to test)
        console.info("My great page is loaded - We are online :)",arguments)
    }).error(function(){
        console.info("ERROR: My great online page is not loaded :/ - possibility of connection loss?",arguments)
    });
}]);

您可以更改您认为永远不会脱机的受信任URL,例如Google,但请记住,该URL应该具有源站访问权限,并且不会显示“访问控制允许源站”错误。没问题。

到目前为止,这一切都很顺利。我注意到,当它无法联系任何东西时,状态为0。这是在我的http拦截器中

responseError: function (rejection) {
    if (rejection.status == 0) {
        // put whatever behavior you would like to happen
    }
    // .......
    return $q.reject(rejection);
}

可能的重复将起作用,但在我向自己的REST端点调用发送请求时不会起作用。我现在要做的是停止我们的Apache服务,看看我的重新启动语言在API调用后会得到什么。检查我的更新,使用“http://ip-API.com/json/和“https://ip-API.com/json/进行测试以离线测试页面YUP,这与我上面写的解决方案相同。
xmlhttprequest.status
在较旧的浏览器上,由于某些边缘案例CORS请求失败,有时会为0。我想你可以考虑“接触失败”,但我认为这是值得注意的。谢谢你的信息。我会注意的。可能很迂腐,但使用
拒绝。状态===0
,进行严格比较:)