>  기사  >  웹 프론트엔드  >  setInterval 타이머_자바스크립트 기술이 부정확한 문제에 대한 해결 방법

setInterval 타이머_자바스크립트 기술이 부정확한 문제에 대한 해결 방법

WBOY
WBOY원래의
2016-05-16 16:49:102284검색

js에서 카운트다운, 타이밍 및 기타 기능에 setInterval을 사용하려는 경우 setInterval의 콜백 함수는 시간이 다 된 직후에 실행되지 않고 시스템 컴퓨팅 리소스가 유휴 상태가 된 후에 실행되기 때문에 정확하지 않은 경우가 많습니다. 그리고 다음 트리거인 Time은 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 fix() {
count ;
var offset = new Date().getTime() - (startTime count * 1000); = 1000 - 오프셋;
if (nextTime 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
.....

트리거 시간은 절대적으로 정확하지 않습니다. 각 트리거는 시간에 맞춰 수정되므로 오류가 누적되지 않습니다.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.