Javascript Can';t取消设置间隔

Javascript Can';t取消设置间隔,javascript,Javascript,正在使用以下代码检查internet连接 var checkstatus = 0 function checkConnection() { $.ajax({ url: "https://path/to/a/file.html", data: { method: 'checkConnection'}, dataType: "html", success: function(html) { clearInt

正在使用以下代码检查internet连接

  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(检查状态)不工作,因为脚本每10秒继续检查一次,这是为什么

  • 发出HTTP请求
  • 错误响应返回
  • 每隔10秒调用checkConnection创建间隔1
  • 发出HTTP请求
  • 错误响应返回
  • 每隔10秒调用checkConnection创建间隔2
  • 发出HTTP请求
  • 成功的回应回来了
  • 间隔2被取消
  • …但间隔1仍在运行


    不要在错误响应中启动间隔。您可以将其作为开始第一次运行checkConnection的方法,也可以使用
    setTimeout

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

  • 发出HTTP请求
  • 错误响应返回
  • 每隔10秒调用checkConnection创建间隔1
  • 发出HTTP请求
  • 错误响应返回
  • 每隔10秒调用checkConnection创建间隔2
  • 发出HTTP请求
  • 成功的回应回来了
  • 间隔2被取消
  • …但间隔1仍在运行


    不要在错误响应中启动间隔。您可以将其作为开始第一次运行checkConnection的方法,也可以使用
    setTimeout


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

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

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

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

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

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

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

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

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

    你想要的是setTimeout而不是setInterval。你想要的是setTimeout而不是setInterval想要设置超时,而不是设置间隔。