2011-03-07 3 views
30

이 내가 t이 때를 분명히 그것은 정의처럼 될 것이라고 생각시간 제한이 지워 졌는지 확인하십시오. 내가 궁금

var t=setTimeout("alertMsg()",3000); 

설정 시간 초과가 여전히인지 알 수있는 방법이다. 그러나 그것은 사라지지 않는 어떤 이드를 가진 것처럼 보인다.

+0

도 참조 http://stackoverflow.com/questions/4021374/how-to-know-if-a-timer-is-cleared-or-timed -out-in-javascript – goodeye

답변

31

직접적으로는 아니지만 랩퍼 개체를 만들어 해당 기능을 제공 할 수 있습니다.

function Timeout(fn, interval) { 
    var id = setTimeout(fn, interval); 
    this.cleared = false; 
    this.clear = function() { 
     this.cleared = true; 
     clearTimeout(id); 
    }; 
} 

는 그런 다음 같은 작업을 수행 할 수 있습니다 : 거친 구현과 같이이다

var t = new Timeout(function() { 
    alert('this is a test'); 
}, 5000); 
console.log(t.cleared); // false 
t.clear(); 
console.log(t.cleared); // true 

내 첫번째 생각은 (폐쇄에서 자신의 이전 값을 저장하는) 새로운 기능 setTimeoutclearTimeout을 교체하는 것이라고 그들의 주장을 수정했지만, 그 다음에 나는 setTimeout이 원시적 인 (따라서 값으로 전달 된) 숫자를 반환한다는 것을 깨달았다. 비 - 프리미티브를 반환하기 시작한다면 래퍼 객체를 만들면 더 많은 유연성을 얻을 수있을 것이라고 생각했습니다. 그러나 그 방법은 당신이 원하는 것과 같을 수 있습니다 - 만약 그렇다면, 당신이 갈 예제가 필요하면 적절한 코드를 제공 할 수 있습니다.

희망이 도움이됩니다.

+0

아래에서 Gavin의 대답을 언급하는 것이 좋을 것입니다. 선택을 취소 할 때 t를 null로 설정하는 것이 매우 간단하게 해결되는 솔루션입니다. – SuperDuperApps

+0

@NigelPeck : 캡슐화, 관심사 분리, 드라이 클리닝 등의 작업이 훨씬 간편합니다. 그러나 이것은 모든면에서 래퍼 객체가 디자인 측면에서 훨씬 뛰어납니다. – Reid

+0

이것은 완전한 천재입니다! –

4

아니요. clearTimeout을 호출 한 후 t 변수를 null로 지정해야합니다. 그렇지 않으면 실제로 지표가 없습니다.

참고로, eval'd가 될 문자열 대신 함수를 직접 참조하는 것이 좋습니다.

var t=setTimeout(alertMsg,3000); 
20

우선, 나는이 답변의 일부분에 대해 리드에게 크레딧을주고 있지만, 몇 가지 제안을 추가해야한다고 생각했습니다. 리드의 코드 내 약간의 추가로,이 것 : 제한 시간이 자연스럽게

  • 선택적으로 시간 제한 기능 (보다는 전역 범위에서 실행)의 범위를 설정 만료되면

    • 자동 취소합니다.
    • 선택적으로 타임 아웃 기능에 인수 배열을 전달
    • 여기

    그것이 :

    function Timeout(fn, interval, scope, args) { 
        scope = scope || window; 
        var self = this; 
        var wrap = function(){ 
         self.clear(); 
         fn.apply(scope, args || arguments); 
        } 
        this.id = setTimeout(wrap, interval); 
    } 
    Timeout.prototype.id = null 
    Timeout.prototype.cleared = false; 
    Timeout.prototype.clear = function() { 
        clearTimeout(this.id); 
        this.cleared = true; 
        this.id = null; 
    }; 
    

    오 [코멘트가없는 플러그를 시작, 내가 추가하는 방법의 프로토 타입 모델을 사용하고 있습니다 클래스에,하지만 내가 그것을 선호하기 때문에 더 정확하다고 생각하지 않기 때문에. [끝 주석없는 플러그]

  • +0

    나는 이것이 얼마나 유연한가 때문에이 접근법을 정말 좋아합니다. +1 – Reid

    +0

    이 대답은 흥미 롭습니다. 그러나 질문에 답하는 요점을 놓치지 마세요. 앞에서 언급해야합니다 ... 시간 초과 및 문제 해결을 지울 때 t를 null로 설정하기 만하면됩니다. – SuperDuperApps

    +0

    @NigelPeck : 나는이 대답이 "질문에 대답 할 때 요점을 놓치는"것을 보지 못합니다. 원래 Asker의 문제에 대한 훌륭한 솔루션을 제공합니다. – Reid

    -2

    시간 초과가 있는지 확인할 수있는 다른 방법이 있습니다. 타임 아웃을 유지하는 값은 기본적으로 시간에 따라 증가하는 숫자 값을가집니다.

    if (someBooleanValue && !parseInt(@changeToCriteriaTimeout) > 0){ 
        //Do something 
    } 
    
    5

    그냥 시간 제한 기능에 (또는 t 귀하의 경우) t0에 설정 : 당신이 clearTimeout를 사용하는 경우

    timeoutID = 0; 
    

    가 타임 아웃을 설정 그래서 우리는 건설 "만일"에서 다음에 수행 할 수 있습니다 id를 0으로 설정하면 timeoutID === 0을 확인하면 해당 값이 지워졌거나 완료되었는지 확인합니다. 일부 사용자처럼

    +0

    훨씬 더 현명한 해결책 Gavin. 실제로 클리어 할 때 타임 아웃을 스스로 null로 제안하지 않고 래퍼 객체를 사용할 필요가 없습니다. 무엇이 더 간단할까요! – SuperDuperApps

    0

    는 타임 아웃이 중 (설정 시간이 경과 한 후) 트리거 또는 clearTimeout와 삭제, false 바람직 null에 수동으로 설정 될 때마다, 의견 제안합니다. 그런 다음 간단한 if-check를 수행하여 이것이 활성 상태인지 확인할 수 있습니다. 또한 필요한 경우 false/null으로 초기화해야합니다.

    이의 작은 테스트 페이지를 만든 : https://codepen.io/TheJesper/pen/rJzava

    관련 문제