2013-06-03 20 views
1

檢查下面的代碼互聯網連接...無法取消set.interval

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); 
     } 
    }); 
} 

爲腳本將繼續每隔10秒檢測線clearInterval(checkstatus);不起作用,這是爲什麼?

+0

你想要setTimeout而不是setInterval。 –

回答

5
  1. HTTP請求時
  2. 錯誤響應返回
  3. 間隔1創建調用checkConnection每10秒
  4. HTTP請求時
  5. 錯誤響應返回創建
  6. 間隔2每10秒調用一次checkConnection
  7. 發出HTTP請求
  8. 成功響應返回
  9. 間隔2被取消

...但間隔1仍在運行。


不要在錯誤響應中啓動間隔。要麼作爲開始首次執行checkConnection的手段,要麼改爲使用setTimeout

setTimeout可能更好,因爲它可以避免競爭條件,其中請求需要超過10秒才能得到響應。

1

setInterval設置回調以每X秒運行一次,並返回該回調的ID。您正在設置一個額外的回調函數,以便每次發生錯誤回調時都會覆蓋前一個時間間隔的ID,但不會取消它。當你最終取消一個內部,它只是你創建的最後一個。

你的錯誤回調需要測試setInterval尚未叫做:

if (checkstatus == 0) 
    checkstatus = setInterval(function(){checkConnection()},10000); 
0

我認爲這是比較容易,如果你會使用setTimeout代替setInterval,你不需要使用明確然後呢。