1

使用以下代码检查互联网连接...

  var checkstatus = 0
  function checkConnection()
  {     
  $.ajax({ 
  url: "https://path/to/a/file.html",
  data: { method: 'checkConnection'},
  dataType: "html",
  success: function(html)
              { 
          clearInterval(checkstatus);
          console.log('connection available');
          return;   
              }    
         },
  error: function(XMLHttpRequest, textStatus, errorThrown){
       console.log('retrying');
       checkstatus = setInterval(function(){checkConnection()},10000);
         }
     });
 }

该行clearInterval(checkstatus);不起作用,因为脚本每 10 秒继续检查一次,这是为什么呢?

4

3 回答 3

5
  1. 发出 HTTP 请求
  2. 错误响应回来了
  3. 每 10 秒调用一次 checkConnection 创建间隔 1
  4. 发出 HTTP 请求
  5. 错误响应回来了
  6. 每 10 秒调用一次 checkConnection 创建间隔 2
  7. 发出 HTTP 请求
  8. 成功响应回来了
  9. 间隔 2 被取消

…但间隔 1 仍在运行。


不要在错误响应中开始间隔。要么将其作为您开始第一次运行 checkConnection 的方式,要么setTimeout改为使用它。

setTimeout可能会更好,因为它将避免请求需要超过 10 秒才能获得响应的竞争条件。

于 2013-06-03T11:57:11.387 回答
1

setInterval将回调设置为每 X 秒运行一次,并返回该回调的 ID。您正在设置一个额外的回调以在每次发生错误回调时运行,覆盖前一个间隔的 ID,但不取消它。当您最终取消一个间隔时,它只是您创建的最后一个。

您的错误回调需要测试setInterval尚未调用:

if (checkstatus == 0)
    checkstatus = setInterval(function(){checkConnection()},10000);
于 2013-06-03T11:57:37.857 回答
0

我认为如果你使用setTimeout而不是使用它会更容易,setInterval并且你不需要使用 clear it。

于 2013-06-03T11:59:06.860 回答