无法取消set.interval

时间:2013-06-03 11:53:55

标签: javascript

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

  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秒继续检查一次,为什么会这样?

3 个答案:

答案 0 :(得分:5)

  1. 发出HTTP请求
  2. 错误回复返回
  3. 创建间隔1,每10秒调用一次checkConnection
  4. 发出HTTP请求
  5. 错误回复返回
  6. 创建间隔2,每10秒调用一次checkConnection
  7. 发出HTTP请求
  8. 成功回复回来
  9. 间隔2已取消
  10. ...但是间隔1仍在运行。


    不要在错误响应中启动间隔。要么将其作为启动第一次checkConnection运行的方式,要么使用setTimeout代替。

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

答案 1 :(得分:1)

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

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

if (checkstatus == 0)
    checkstatus = setInterval(function(){checkConnection()},10000);

答案 2 :(得分:0)

我认为如果您使用setTimeout而不是setInterval会更容易,而且您不需要使用清除它。