国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

setInterval計時器不準的問題解決方法

2019-11-20 20:42:48
字體:
來源:轉載
供稿:網友
在js中如果打算使用setInterval進行倒數,計時等功能,往往是不準確的,因為setInterval的回調函數并不是到時后立即執行,而是等系統計算資源空閑下來后才會執行.而下一次觸發時間則是在setInterval回調函數執行完畢之后才開始計時,所以如果setInterval內執行的計算過于耗時,或者有其他耗時任務在執行,setInterval的計時會越來越不準,延遲很厲害.

下面的代碼可以說明這個問題
復制代碼 代碼如下:

var startTime = new Date().getTime();
var count = 0;
//耗時任務
setInterval(function(){
var i = 0;
while(i++ < 100000000);
}, 0);
setInterval(function(){
count++;
console.log(new Date().getTime() - (startTime + count * 1000));
}, 1000);

代碼里輸出了setInterval觸發時間和應該正確觸發時間的延遲毫秒數
復制代碼 代碼如下:

176
340
495
652
807
961
1114
1268
1425
1579
1734
1888
2048
2201
2357
2521
2679
2834
2996
......

可以看到延遲是越來越嚴重的.

為了在js里可以使用相對準確的計時功能,我們可以
復制代碼 代碼如下:

var startTime = new Date().getTime();
var count = 0;
setInterval(function(){
var i = 0;
while(i++ < 100000000);
}, 0);
function fixed() {
count++;
var offset = new Date().getTime() - (startTime + count * 1000);
var nextTime = 1000 - offset;
if (nextTime < 0) nextTime = 0;
setTimeout(fixed, nextTime);

console.log(new Date().getTime() - (startTime + count * 1000));
}
setTimeout(fixed, 1000);

代碼里,通過1000(也就是周期時間)減去當前時間和準確時間的差距,來算出下次觸發的時間,從而修正了當前觸發的延遲.

下面是輸出
復制代碼 代碼如下:

186
200
230
271
158
899
900
899
900
899
899
899
902
899
418
202
232
266
145
174
192
214
242
268
149
179
214
......

可以看到雖然觸發時間并非絕對準確,但由于每次觸發都進行及時修正,所以并沒有造成誤差積累.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 马尔康县| 泰来县| 六枝特区| 宝山区| 棋牌| 胶南市| 巴楚县| 古蔺县| 郎溪县| 内丘县| 伊宁县| 青海省| 改则县| 湘阴县| 民勤县| 东乌珠穆沁旗| 闻喜县| 海兴县| 宜兰县| 玉田县| 和田市| 定陶县| 无为县| 富裕县| 屏南县| 深水埗区| 惠州市| 舟曲县| 普洱| 霸州市| 大名县| 敖汉旗| 兴和县| 丁青县| 社会| 慈溪市| 临泽县| 多伦县| 南平市| 永济市| 昌平区|