JS에서는 카운트 다운, 타이밍 및 기타 기능에 SetInterval을 사용하려는 경우 시간에 도달 한 직후 SetInterval의 콜백 기능이 실행되지 않지만 시스템의 컴퓨팅 리소스가 유휴 상태가 될 때까지 실행되지 않기 때문에 종종 부정확합니다. SetInterval 콜백 함수가 실행 된 후 다음 트리거 시간이 시작되지 않습니다. 따라서 SetInterval에서 실행 된 계산이 너무 시간이 많이 걸리거나 다른 시간 소모적 인 작업이 실행되면 SetInterval의 타이밍이 점점 부정확 해지고 매우 심각한 지연이 발생합니다.
다음 코드는이 문제를 설명 할 수 있습니다
코드 사본은 다음과 같습니다.
var starttime = new date (). gettime ();
var count = 0;
// 시간이 많이 걸리는 작업
setInterval (function () {
var i = 0;
while (i ++ <1000000000);
}, 0);
setInterval (function () {
카운트 ++;
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 ++ <1000000000);
}, 0);
함수 고정 () {
카운트 ++;
var 오프셋 = 새 날짜 (). gettime () - (starttime + count * 1000);
var nexttime = 1000- 오프셋;
if (nexttime <0) nexttime = 0;
settimeout (고정, 다음 시간);
console.log (new date (). gettime () - (starttime + count * 1000));
}
settimeout (고정, 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
......
트리거 시간이 절대적으로 정확하지는 않지만 각 트리거가 시간이 정정되므로 오류 축적이 발생하지 않기 때문에 알 수 있습니다.