2014-04-08 25 views
0

我有一個需求,我需要從js通過ajax查詢數據庫以檢查狀態。如果狀態爲「激活」,則應停止輪詢,並且警報應彈出「案件現在處於活動狀態」。 js應該每2秒檢查一次數據庫,直到db狀態返回「active」。你能爲此提供一個優雅的js例程嗎?下面是一些一般的JS顯示什麼我想做的事:如何設計一個優雅的js輪詢例程?

function ReportAsActivePoll() 
{ 
    for(var i=0; i<10; i++) 
    { 
     setTimeout(StatusIsActive,(i*2000)); 
     if(statusIsActive) 
     { 
     ReportAsActive(); 
     break; 
     } 
    } 
} 

var statusIsActive = false; 
function StatusIsActive(case) 
{ 
    statusIsActive = GetStatusFromDB(case) == "active"; 
} 

function ReportAsActive() 
{ 
    alert("case is now active") 
} 

的幾個注意事項:

  • 我知道上面的代碼是不正確的。這僅用於說明目的。
  • 上面的代碼將調用StatusIsActive 10次。我希望在狀態處於活動狀態後,呼叫可以停止/中止/停止。不過,我認爲投票需要提前排隊所有電話,所以我不知道如何實現這一點。
+0

在Web瀏覽器中從DB獲取數據的異步AJAX調用或類似node.js的同步調用服務器端?它對你如何處理它有很大的影響。如果服務器知道數據庫何時更新,那麼使用套接字會更好,因此您不必輪詢輪詢更改,而是將消息發送到打開的連接。 – zzzzBov

回答

0

爲簡單起見,使用setInterval()clearInterval()。像這樣:

<script type="text/javascript"> 

function checkStatus(theCase) { 
    var intervalId = window.setInterval(function() { 
     if (getStatusFromDb(theCase) == 'active') { 
      clearInterval(intervalId) 
      reportAsActive() 
     } 
    }, 2000) 
} 
function reportAsActive() 
{ 
    alert("case is now active") 
} 

var tmpCounter = 0 
function getStatusFromDb(theCase) 
{ 
    if (tmpCounter++ == 4) return "active" 
} 
checkStatus('case 123') 

</script> 

您還應該考慮使函數以小寫字母開頭,因爲這是正常的JS約定。通過選擇另一種風格,您可能會遇到區分大小寫的錯誤,這些錯誤令人討厭。

0

您需要使用setInterval而不是setTimeout,並且當您收到有效答覆時,必須使用clearInterval刪除此區間。

所以,你需要做這樣的事情

var intervalID = window.setInterval(function(){ 
    var resFromYourDB = ...; // get your result via ajax 
    if (resFromYourDB['active']){ 
    window.clearInterval(intervalID); 
    // do you alert 
    } 
}, 2000) 

這樣,這將是輪詢服務器,直到它會得到active作爲響應,而不是預定義的時間量與setTimeout的。當它會得到這個響應時,它會停止。