Javascript Can';t取消设置间隔
正在使用以下代码检查internet连接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
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想要设置超时,而不是设置间隔。