[英]Why my setInterval function doesn't stop
我需要在javascript中編寫setInterval函數。 這是代碼:
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中停止。 有人可以幫助我嗎?
您聲稱該代碼確實“在'if'中進來” ,所以我認為實際上正在進行clearInterval
調用。
鑒於此,最有可能的解釋是間隔已被清除(畢竟, select
不會中斷 ),但是在第一個"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請求花費一秒鍾以上的時間(這可能發生)時,您的ajax回調可以在clearInterval
之前 / 之后 / 之后 / 之后觸發,這使您感到setInterval
不會停止 。
請注意,您的time
變量是無用的,因為它是一個函數范圍的變量,您在每次函數調用時都將其初始化為0
。 即使它是一個全局變量,它也只會清除第11個成功函數回調中的時間間隔,而沒有任何東西可以保證這11個成功請求將花費多長時間。
解
正如TJ Crowder建議的那樣 ,最好在上一個調用的成功回調中安排下一個ajax調用,以確保您的ajax請求順序觸發(一次僅觸發一次)。
注意 :由於您是在回答后編輯問題的,因此您還需要編輯if條件,如下所示:
success: function(response) {
if (response != "true" && time < 10000) {
setTimeout(start, Math.max(0, 1000 - (Date.now() - started)));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.