Javascript 为什么我的setInterval函数没有';停不下来
我需要用javascript编写一个setInterval函数。这是代码:Javascript 为什么我的setInterval函数没有';停不下来,javascript,ajax,Javascript,Ajax,我需要用javascript编写一个setInterval函数。这是代码: var myTimer=setInterval(function(){ var time=0; $.ajax({ url:'...' type: "POST", dataType:"", success: function (response) { if(r
var myTimer=setInterval(function(){
var time=0;
$.ajax({
url:'...'
type: "POST",
dataType:"",
success: function (response) {
if(response=="true" || time>=10000){
clearInterval(myTimer);
}
time=time+1000;
},
error: function () {
alert("FAIL");
}
});
},1000);
我不知道为什么它不在clearInterval停止。有人能帮我吗?您声称代码确实“出现在“如果”中,因此我假设
clearInterval
调用实际上正在进行
考虑到这一点,最有可能的解释是间隔正在被清除(毕竟),但是在第一个“true”
响应之前,您已经进行了多个ajax调用,您看到的其他调用是在间隔被清除之前安排的
例如,您的代码运行并:
“true”
为“true”
,清除了间隔setInterval
和一个通过ajax
)会带来麻烦
如果目标是每秒发出一次请求并在返回时停止“true”
,我会让成功处理程序安排下一次调用,例如:
(function() {
var time = 0;
var started = 0;
start();
function start() {
started = Date.now();
$.ajax({
url: '...'
type: "POST",
dataType: "",
success: function(response) {
if (response != "true") {
// Schedule the next call to occur one second after we
// started the previous call; or almost immediately if
// the call took more than a second to complete
setTimeout(start, Math.max(0, 1000 - (Date.now() - started)));
}
time = time + 1000;
},
error: function() {
alert("FAIL");
}
});
}
})();
让我举例说明预期和实际情况,使事情更清楚
情景#1
下图显示了所有ajax请求在一秒钟内完成的情况。您会注意到ajax回调success
(或error
)函数只会在clearInterval
之前执行(这是您一直期望的)
场景#2
当一些ajax请求花费的时间超过1秒时(可能会发生这种情况),ajax回调可以在clearInterval
之前和之后/触发,这让您感觉到setInterval
没有停止
请注意,time
变量是无用的,因为它是一个函数范围内的变量,每次函数调用时都会初始化为0
。即使它是一个全局变量,它也只会清除第11个成功函数回调中的间隔,并且无法保证这11个成功请求将花费多长时间
解决方案
同样,最好在前一个成功回调中安排下一个ajax调用,这可以保证ajax请求按顺序发出(一次只能发出一个)
注意:因为您在他的回答之后编辑了您的问题,所以您还需要像下面这样编辑if条件:
success: function(response) {
if (response != "true" && time < 10000) {
setTimeout(start, Math.max(0, 1000 - (Date.now() - started)));
}
}
成功:功能(响应){
如果(响应!=“真”&&time<10000){
setTimeout(start,Math.max(01000-(Date.now()-start));
}
}
你有吗?很可能响应永远不等于“true”
是的,它出现在没有引号的“if”“true”try true中,检查字符串“true”而不是实际的布尔值true,因为ajax请求需要超过1000毫秒,所以在清除它之前,间隔会经过很多次,可能是同一个问题