2013-10-02 7 views
1

나는 핸들러에 들어오는 인터럽트가 너무 많아서 마지막 인터럽트 이후 5ms가 경과 할 때까지 기다리지 말고 기다려야한다.setTimeout() 자체가 재설정됩니까?

내 생각 엔 처리기에 들어갈 때마다 setTimeout(LookAtInterrupts, 5)으로 전화를 걸었지만 setTimeout() 설명서에는 해당 실행이 시작되기 전에 호출 된 보류중인 예정된 호출이 취소된다고 표시되지 않습니다.

실제로, 그것이 무엇입니까? 모든 핸들러 인터럽트가 끝난 후 5ms가 걸리고 싶지는 않습니다.

답변

9

없음 수동으로 타임 아웃을 재설정 할 수 있습니다, 그것은하지 않습니다 - 당신이 원하는만큼 대기 시간 제한을 할 수 있습니다. 그런 다음

var key = setTimeout(...); 

나중에 취소 : 이미 만료 된 키 clearTimeout()를 호출

clearTimeout(key); 

가 아닌

기능은 나중에 시간 제한을 취소하는 데 사용할 수있는 키를 반환 오류가 발생하여 동기화 문제에 대해 걱정할 필요가 없습니다.

2

setTimeout은 재설정되지 않습니다.

당신은

var timeout = setTimeout(...); 
clearTimeout(timeout); 
1

setTimeout()은 이전 타임 아웃을 암시 적으로 취소하지 않습니다.

그러나 식별자에 변수를 저장하고 그 값을 지울 때마다이를 달성 할 수 있습니다.

var timeoutId = null; 
var yourFn = function() { 
    clearTimeout(timeoutId); 
    timeoutId = setTimeout(fn, 5); 
}; 
1

참조를 저장해야합니다. setTimeout 결과를 저장하고 나중에 지울 수 있습니다. setTimeout는 "재설정"옵션

:

// first assign it 
var timeout = setTimeout(function(){ 
    foo(); 
}, 50); 

// then look for an existing assignment before re-assinging 
if (timeout) clearTimeout(timeout); 
timeout = setTimeout(function(){ 
    bar(); 
}, 50); 

참조 :

제쳐두고

, be careful 타임 아웃을 < 5ms의 설정. HTML5는 4를 지원하기로되어 있지만, 실제로는 그 근처에있는 것으로 의심됩니다 (시간 제한을 설정하는 데 드는 비용). 이로써

0

저장 변수에 그의 setTimeout 호출을 참조하고, 각 인터럽트 성공적인 후, 제한 시간을 만들기 전에, 이전의 타임 아웃을 취소

var tv = null; 

function interrupt(){ 
    if(tv !== null){ 
     clearTimeout(tv); 
    } 
    tv = setTimeout(LookAtInterrupts,5) 
} 

function LookAtInterrupts(){ 

} 

, 당신은 마지막 인터럽트가 계속 보장합니다 5ms 간격으로 실행. 나는 그것이 분명했기를 바란다.

0

직접 구현할 수도 있지만 실제적인 해결책은 밑줄을 긋는 것입니다.js를 실행하고 디버깅 기능을 사용하십시오 (http://underscorejs.org/#debounce 참조).

은 그럼 당신은 할 수 있습니다 :

var lookAtInterrupts = _.debounce(handleInterrupt, 5); 

결과 기능은 최대 한 번 5ms마다 실행됩니다.

0

setTimeout()이 실행되면 바인드 된 전화 번호는 function()입니다.

var timeOutID = setTimeout(LookAtInterrupts, 5); 
(...) 
clearTimeOut(timeOutID); 
: 당신이 그것을 취소하려면

당신은 ID가 setTimeout()에 의해 반환하고 명확로 가야