2012-06-06 80 views
2

我決定將這段代碼包含到一個對象中,以將它從它將要應用的區域中分離出來。這裏任何意見是真正的讚賞:如何檢查一個變量是否是Javascript中的超時?

appConfig.loadElement和appConfig.cerrorElement是這些HTML元素:

<div id="loading" style="display:none;">Loading...</div> 
<div id="cerror" style="display:none;">Connection Error.</div> 


var loadingTimeoutInstance = null, cerrorTimeoutInstance = null, 
    requestObj = { 
    reset: function() { 
     $(appConfig.loadElement).hide(); 
     $(appConfig.cerrorElement).hide(); 
     clearTimeout(loadingTimeoutInstance); 
     clearTimeout(cerrorTimeoutInstance); 
    }, 
    initiate: function() { 
     loadingTimeoutInstance = setTimeout(requestObj.timeout, appConfig.loadingDelayMS); 
    }, 
    timeout: function() { 
     clearTimeout(loadingTimeoutInstance); 
     $(appConfig.loadElement).show(); 
     cerrorTimeoutInstance = setTimeout(requestObj.cerror, appConfig.cerrorDelayMS); 
    }, 
    cerror: function() { 
     clearTimeout(cerrorTimeoutInstance); 
     $(appConfig.loadElement).hide(); 
     $(appConfig.cerrorElement).show(); 
    } 
} 

實現是像這樣:

當異步請求時:

requestObj.reset(); 
requestObj.initiate(); 

返回響應後:

requestObj.reset(); 

我發現的問題主要在requestObj.reset()中: - 爲什麼要隱藏元素(如果它們已被隱藏)? - 如果它們沒有設置爲超時,則無法清除超時變量(loadingTimeoutInstance和cerrorTimeoutInstance) - 這會導致它不起作用。

+0

「重新隱藏」一個元素通常沒有問題;它會保存一個檢查(不會改變語義),因爲只有最後的狀態被關心。最後一點令人困惑的是:「如果它們沒有被設置爲暫停......導致它無法工作」......它以什麼方式不起作用?有一個小提琴測試案例? – 2012-06-06 23:28:35

+0

我不知道爲什麼當我清除尚未設置的超時時它不起作用。其他幾次我都遇到過這個問題,這種情況就是其中之一。不過,艾倫的解決方案效果很好。關於隱藏一個已經隱藏的元素 - 它只是困擾我,因爲這在邏輯上沒有意義,我知道結果不受影響。感謝您的建議:) – TaylorMac

回答

4

你實際上並不需要檢查它是否屬於某種類型......就是這樣。

if(cerrorTimeoutInstance) clearTimeout(cerrorTimeoutInstance);

+6

你甚至不需要這個檢查。如果通過'null','undefined'或''巧克力是好的'',clearTimeout'會高興地「不做任何事情」。但是,謹慎性規定超時ID被遺忘了,因爲它可能在技術上被重用......(我想大多數實現會使這個「很難做」,但沒有檢查過。) – 2012-06-06 23:22:29

+2

繼pst的評論之後,調用'clearTimeout(cerrorTimeoutInstance)'變量'cerrorTimeoutInstance'仍然保持相同的值(它只是一個用作ID的數字)。沒有辦法知道給定ID的超時是否已經運行或者先前已被清除,但是由於pst意味着不太可能再次使用相同的ID,所以再次調用'clearTimeout()'來安全地再次使用相同的ID是安全的。 – nnnnnn

相關問題