簡體   English   中英

為什么我的setInterval函數不會停止

[英]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調用,而另一個調用了正在查看的是在清除間隔之前安排的時間。

例如,您的代碼運行並:

  1. 觸發ajax調用#1,這需要一秒鍾以上的時間才能完成
  2. 觸發ajax調用#2
  3. Ajax調用#1完成但不是"true"
  4. 觸發Ajax呼叫#3
  5. Ajax調用2已完成且為"true" ,清除了間隔
  6. Ajax呼叫#3完成

混合兩個單獨的異步間隔(一個通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM