2015-05-22 54 views
0

我需要在javascript中編寫一個setInterval函數。這是代碼:爲什麼我的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。任何人都可以幫助我?

+1

你[嘗試調試它(HTTP://計算器.COM /問題/ 988363 /何燦我調試,我的JavaScript代碼)?這很可能是答案永遠不會等於「真」 – Liam

+0

是它進來的「如果」 – Poppy

+0

「真」沒有引號試試,檢查字符串「真」不是真實的布爾真 – Lukas

回答

0

讓我說明預期和讓事情變得更加清晰。

方案1

下圖顯示的情況下你所有的Ajax請求前一秒完成。你會注意到,ajax回調success(或error)函數將只在clearInterval之前執行(這是你總是期望的)。

enter image description here

方案2

當你的一些Ajax請求的花費超過一秒(這可能是發生了什麼),那麼你的AJAX回調可以發射以前/後/ 之前和之後clearInterval,這讓你覺得你的setInterval不停止

enter image description here

請注意,您的time變量是無用的,因爲它是你初始化爲0每個函數調用一個函數範圍的變量。即使它是一個全局變量,它也只會在第11次成功函數回調中清除時間間隔,並且不能保證這11次成功請求將花費多長時間。

解決方案

由於T.J. Crowder suggested,最好安排在上一次的成功回調,這保證了未來AJAX調用Ajax請求火的順序(僅一次一個)。

:因爲你他的回答後,編輯你的問題,那麼你還需要編輯如果條件是這樣的:

success: function(response) { 
    if (response != "true" && time < 10000) { 
    setTimeout(start, Math.max(0, 1000 - (Date.now() - started))); 
    } 
} 
2

你聲稱代碼確實是「進來」如果'「,所以我認爲clearInterval調用實際上正在進行。

鑑於這種情況,最有可能的解釋是,間隔被清除(畢竟,select isn't broken),但第一"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"); 
      } 
     }); 
    } 

})();