2012-11-15 118 views
1

我有一個函數checkReg(),它檢查我的設備是否已經在服務器上註冊了第一個啓動的代碼並返回一個regStatus變量。該功能工作正常,但需要一段時間才能完成註冊,並且我的申請無法繼續進行,但未確認已完成註冊。JavaScript定時器線程

我想使用一個簡單的線程來檢查regStatus一次1秒,並在5次嘗試後,如果它尚未註冊然後殺死線程並返回,如果它在5次嘗試之前完成然後殺死線程和繼續。

Thread(run every 1 sec){ 
    regStatus=checkReg(); 
    if(regStatus==='done'){ 

     //do something 
     //kill thread 
    }else if(regStatus==='inprogress'){ 

     //do nothing 
    }elseif(regStatus==='error'){ 

     //kill thread 
    } 
} 

我對JS很新,不知道如何開始,時間或殺死線程。我已經使用setTimeout函數,但我不確定它可以做我想要的。

+3

的JavaScript通常是單線程的。你的'checkReg'正在做一個'XMLHttpRequest'? –

+0

我相信是這樣的,它是一個來自第三方SDK的函數我使用它必須與他們的服務器通信 – Amanni

+0

@Amanni:它不提供回調或什麼? 'checkReg'實際上做了什麼? – Bergi

回答

0

JavaScript沒有線程一般,但你可以很容易地使用setInterval()代替:

var retry = 0 

function checkStatus() { 
    var regStatus=checkReg(); 
    if(regStatus==='done'){ 
    //... 
    } 
    if(++retry > 5) { 
    clearTimeout(id); 
    } 
} 

var id = setInterval(checkStatus, 1000); 
+0

如果'regStatus'發出同步請求,它仍然會阻塞。使用'setTimeout'不會阻止這一點。它只是延遲執行一秒鐘。 –

+0

@ user1689607:你說得對,我認爲'checkReg()'不會影響'setTimeout()'的頻率。如果是這樣,OP將在UI響應方面遇到更大的問題。當然,他可以使用'setTimeout()'並每次計算延遲(1秒減去'checkReg()'運行時間)。 –

+0

我會阻止,但不到5秒,除了有一個錯誤,那麼它只是五秒鐘。我會使用它,直到找到不會阻止的解決方案。 – Amanni