最近項目中有應用到倒計時,其中出現了一些問題和問題的解決方案,以爲蠻有分享價值,因而決定寫篇文章記錄一下。javascript
這是很廣泛的問題,雖而後端能夠作校驗,可是不免本地時間會和服務器時間存在誤差,致使用戶體驗並不友好。(明明本地時間已是倒計時結束了,但是仍是沒法正常展現該展現的功能)html
對於這個問題,咱們該選用setTimeout
+循環的形式仍是setInterval
。我的認爲仍是使用setInterval
更加符合咱們的業務邏輯。java
code:後端
var myInterval = setInterval(function(){
//執行請求 獲取當前服務端時間 並進行相應操做
},1000)
這個方案對於稍微有點經驗的開發人員來講,都知道是不可取的。由於這會給服務器形成沒法想象的壓力,致使應用崩潰。好比我在這個頁面停留一分鐘,那麼請求就發送了60次,假如此時有100我的在訪問這個頁面,那麼一分鐘就有6000條請求,人數若是再增加,這絕對會形成沒必要要的服務器壓力。而且這個方案的倒計時,也會存在很大的偏差,由於請求存在延遲,跟你的網絡狀態也有很大的關係。api
code:服務器
//假設請求獲取到一個時間戳 TIMEDIFF
var myInterval = setInterval(function(){
TIMEDIFF--;
//執行頁面倒計時的渲染
},1000)
優勢:markdown
缺點:網絡
//假設請求獲取到一個時間戳 TIMEDIFF
var endTime = Date.now()+TIMEDIFF;//以本地時間爲基準得到一個結束時間
var myInterval = setInterval(function(){
var countDown = endTime - Date.now()
//每秒會獲取本地時間,這樣就算執行的週期不許確
//也能夠準確的獲取時間差
//執行頁面倒計時的渲染
},1000)
//entry.js入口文件
...
if(!window.dateDiff){
$.get('api/GetTimeDiff',
{nowDate:Date.now()},
function(dateDiff){
window.dateDiff = dateDiff;
//講時間差存在全局變量中,方便在其餘模塊中調用
})
}
...
//other.js 其餘模塊
...
var myInterval = setInterval(function(){
var countDown = endTime - Date.now()+dateDiff;
//每秒會獲取本地時間,這樣就算執行的週期不許確
//也能夠準確的獲取時間差
//執行頁面倒計時的渲染
},1000)
...
優勢:post
缺點:ui
固然,解決方案確定不僅以上幾種,歡迎有想法的同窗補充。對比以上三個方案,第一個不可行,第二和第三本質上是相似的東西,只是第三種方案將差值從模塊中抽離出來,而且調用次數也下降了不少,我的會比較喜歡第三種方案。此文章會持續保持更新狀態,有想法,有問題的同窗均可以聯繫我!!
引:http://www.cnblogs.com/cydiacen/p/6287538.html