亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我的這段js倒計時為什么越走越慢?

我的這段js倒計時為什么越走越慢?

慕的地6264312 2019-05-20 17:21:57
varorderTimeOut=900000;vartimer=setInterval(()=>{orderTimeOut-=10;if(orderTimeOut>10){times=overTime(orderTimeOut);console.log(times)}else{orderTimeOut=0;times="00:00:00";}},10);functionoverTime(time){vara=(time%1000).toString().substr(0,2);varb=Math.floor(time/1000);varm=b%60;m=String(m);m=m.length>=2?m:"0"+m;varf=Math.floor(time/(1000*60));f=String(f);f=f.length>=2?f:"0"+f;returnf+":"+m+"."+a;}這段方法能夠正常進行倒計時,但是觀察到,它似乎越跑越慢.....
查看完整描述

2 回答

?
波斯汪

TA貢獻1811條經驗 獲得超4個贊

無論是setInterval還是setTimeout,時間肯定是不對的。計時器邏輯是task執行完成后,查看timer是否過時,如果過時,執行timer回調。也就是說如果有同步方法在運行,那么計時器的回調就會延后,而如果倒計時很久,這個延后的時間累加就會造成和真實時間不同步。
leti=0;
setInterval(()=>{
if(i===0){
console.log('start',Date.now())
letlastTime=newDate().getTime()+10*1000;//暫停10s
while(lastTime>newDate().getTime()){
}
}
i++;
console.log(i,Date.now())//以后的時間都延遲了10s+
},1000)
                            
查看完整回答
反對 回復 2019-05-20
?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

剛做了下測試,在一個只運行此方法的頁面上,對比系統時間進度,還是很同步的。實際項目中,運行的功能比較多,而setInterval會將事件放到當前隊列的最后執行,看起來的確有點卡殼。不過實際應該不會變慢,如果我理解的setInterval沒錯的話。有setInterval,瀏覽器會單獨開一個線程,每隔幾毫秒將此方法扔進JS隊列。每隔幾秒是比較固定的,但什么時候執行放進去的代碼卻是不可控的。如果當前隊列的事情比較多,短時間不會執行此方法,看起來就變慢了。不過相應的,也會在某個時刻一次性執行很多次此方法。
補充另個相對優化的倒計時方法。接到要倒計時的總時間T,并記下當前的時間tStart。使用setTimeout隔一段時間執行方法,方法里結合三個變量的關系(加上現在的時間)算出剩余時間。再次調用setTimeout重復操作。
                            
查看完整回答
反對 回復 2019-05-20
  • 2 回答
  • 0 關注
  • 271 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號