2013-12-08 2 views
1

나는 웹 사이트를 가지고 있고 이미지를 교환하기 위해 javscript 타이머를 사용하고있다.자바 스크립트를위한 신뢰할 수있는 타이머

I는 다음과 같이 타이머를 사용하고 있습니다 :

var myTimer = window.setTimeout(MyFunction, MyInterval); 

function MyFunction 
{ 
//do something 
//recalll timer 
} 

을 지금 내가 가지고있는 문제는 내가 내 응용 프로그램에서 받아 들일 수있는 간격이 일정한 간격으로 떨어져 발생하지 않는 것을하지 왜 내가 이해 달라질 수 있습니다.

내가 가진 문제는 매 순간 타이머가 몇 초 동안 멈추고 다시 시작된다는 것입니다.

타이머를 임의로 일시 중단 한 주된 원인은 무엇입니까?

리소스가 호스팅 브라우저 PC의 다른 프로세스로 전환 되었기 때문입니까 아니면 JavaScript 타이머를 사용하는 것인가?

후자는 영원한 순환을해야합니까? 어디에서나 내가 읽고 실행 한 곳은 무한 루프가 모든 리소스를 잡아서 타이머 무작위 서스펜션보다 더 큰 악마가 될 것임을 나타냅니다.

일반적인 빠른 코드 실행이 중요 할 때 javascript 타이머를 사용하는 다른 방법이 있습니까?

감사

+1

자바 스크립트는 _client_에서 실행됩니다. – SLaks

+0

@SLaks 안녕하세요, 지적 해 주셔서 고맙습니다.나는 내 질문에 그걸 넣지 않았 음을 알았다. 나는 그것을 바로 잡았다. 다시 한 번 감사드립니다 –

+1

안녕하세요, 아마도 setInterval()은 몇 초마다 이미지를 변경해야 할 때만 필요합니다. –

답변

2

당신이 MyFunction 내에서 실행되는 코드는 (당신이 무엇을하고 있는지에 따라) 실행하는 데 약간의 시간이 소요됩니다. 해당 함수가 끝날 때 타이머를 호출하면 코드 실행 시간이 추가되기 때문에 간격은 정확히 MyInterval이 아닙니다. setTimeout() 대신 setInterval()을 사용하면 (MyInterval + execution time) 밀리 초 대신 정확히 MyInterval 밀리 초마다 주어진 함수가 실행됩니다.

질문에 대답하기 위해 코드 실행 시간 때문에 임의 중단이 발생합니다.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 따라서 초 단위의 길다란 지연이 내 코드의 실행에 미치지 않는다면 내 코드의 실행이 항상 똑같은 일을한다는 것을 안다면 내 서버의 호스트에 내 도메인 공간에 리소스를 할당하는 것이 좋을까요? 또한 setInterval()을 사용하면 제출 된 순서와 다른 순서로 이미지를 표시 할 위험이 있습니까? –

+0

setTimeout 동안 setInterval을 사용하면 이미지를 가져 오는 논리가 변경되지 않습니다. 변수를 사용하여 이미 가져온 이미지를 추적하거나 setInterval에 의해 호출되는 모든 함수에 액세스 할 수있는 image-URL 배열을 추적해야 할 수도 있습니다. –

+0

안녕하세요. 내 이미지 함수를 호출하면 몇 초의 두려운 서스펜션 사이클에 빠지며 setInterval을 사용하여 이미지 함수를 다시 호출하면 1을 끝내기를 기다리는 동안 이전에 기다렸다가 같은 지연을 경험하게됩니다 귀환 또는 2 차 통화가 1 차 통화에 과도하게 뿌려 질 것인가? –

1

웹 사이트에서 비슷한 문제가 발생하여 jQuery 플러그인의 다른 타이머 트리거 작업에서 궁극적으로 범인이 발견되어 가끔 내 자신의 기능 실행을 지연시키는 경우가있었습니다. 사이트에서 외부 코드를 사용하는 경우 일부 디버깅을 수행하여이 코드가 사용자의 경우인지 확인할 수도 있습니다.

가능한 해결 방법은 web workers입니다. 작업자 작업은 분리 된 스레드에서 실행되므로 주 스레드의 내용이 완료되는 데 너무 오래 걸리면 지연되지 않습니다.

var worker = new Worker('worker.js'); 

을 그리고라는 다른 파일에 당신은 쓸 것 "worker.js":

코드는 다음과 같을 것이다

var myTimer = setTimeout(MyFunction, MyInterval); 

function MyFunction 
{ 
//do something 
//recalll timer 
} 

그냥 setTimeout 전에 더 이상 아무 window.이없는 점에 유의 . 이는 웹 작업자가 DOM에 직접 액세스 할 수 없기 때문입니다.

문제를 해결할 수 있다고 보장 할 수는 없지만 테스트 할 가치가 있습니다.

+0

안녕하세요, 모든 정보에 감사드립니다. 난 혼자가 아니야. 나는 모든 것을 지금 당장 가서 무슨 일이 일어나는지 볼 것이다. 고마워! –

+0

@AndrewSimpson 여러분을 환영합니다. –

+1

이에 대한 의견을 보내주십시오. 필자는 클라이언트에게 4 개의 인수를 반환하는 데 어려움을 겪었다. 볼 수있는 이미지 src가 4 개 있고 PostMessage가 옵션/인수를 제공합니다. 꽤 틀렸을지라도 다른 것은 나에게 오류를 주었다. 속도 테스트가 다른 곳에서보고되었지만 나를 걱정스럽게 만들었습니다. 데이터가 UI로부터 외삽된다는 사실을 좋아하지만 실제로 처리 시간은 증가했습니다. 그래서 나를 위해서가 아닙니다. 그러나 봐 보는 것은 매우 흥미있는 것. 고맙다. –

관련 문제