이 내가 t이 때를 분명히 그것은 정의처럼 될 것이라고 생각시간 제한이 지워 졌는지 확인하십시오. 내가 궁금
var t=setTimeout("alertMsg()",3000);
설정 시간 초과가 여전히인지 알 수있는 방법이다. 그러나 그것은 사라지지 않는 어떤 이드를 가진 것처럼 보인다.
이 내가 t이 때를 분명히 그것은 정의처럼 될 것이라고 생각시간 제한이 지워 졌는지 확인하십시오. 내가 궁금
var t=setTimeout("alertMsg()",3000);
설정 시간 초과가 여전히인지 알 수있는 방법이다. 그러나 그것은 사라지지 않는 어떤 이드를 가진 것처럼 보인다.
직접적으로는 아니지만 랩퍼 개체를 만들어 해당 기능을 제공 할 수 있습니다.
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
내 첫번째 생각은 (폐쇄에서 자신의 이전 값을 저장하는) 새로운 기능 setTimeout
및 clearTimeout
을 교체하는 것이라고 그들의 주장을 수정했지만, 그 다음에 나는 setTimeout
이 원시적 인 (따라서 값으로 전달 된) 숫자를 반환한다는 것을 깨달았다. 비 - 프리미티브를 반환하기 시작한다면 래퍼 객체를 만들면 더 많은 유연성을 얻을 수있을 것이라고 생각했습니다. 그러나 그 방법은 당신이 원하는 것과 같을 수 있습니다 - 만약 그렇다면, 당신이 갈 예제가 필요하면 적절한 코드를 제공 할 수 있습니다.
희망이 도움이됩니다.
아래에서 Gavin의 대답을 언급하는 것이 좋을 것입니다. 선택을 취소 할 때 t를 null로 설정하는 것이 매우 간단하게 해결되는 솔루션입니다. – SuperDuperApps
@NigelPeck : 캡슐화, 관심사 분리, 드라이 클리닝 등의 작업이 훨씬 간편합니다. 그러나 이것은 모든면에서 래퍼 객체가 디자인 측면에서 훨씬 뛰어납니다. – Reid
이것은 완전한 천재입니다! –
아니요. clearTimeout
을 호출 한 후 t
변수를 null로 지정해야합니다. 그렇지 않으면 실제로 지표가 없습니다.
참고로, eval'd가 될 문자열 대신 함수를 직접 참조하는 것이 좋습니다.
var t=setTimeout(alertMsg,3000);
우선, 나는이 답변의 일부분에 대해 리드에게 크레딧을주고 있지만, 몇 가지 제안을 추가해야한다고 생각했습니다. 리드의 코드 내 약간의 추가로,이 것 : 제한 시간이 자연스럽게
그것이 :
는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;
};
오 [코멘트가없는 플러그를 시작, 내가 추가하는 방법의 프로토 타입 모델을 사용하고 있습니다 클래스에,하지만 내가 그것을 선호하기 때문에 더 정확하다고 생각하지 않기 때문에. [끝 주석없는 플러그]
나는 이것이 얼마나 유연한가 때문에이 접근법을 정말 좋아합니다. +1 – Reid
이 대답은 흥미 롭습니다. 그러나 질문에 답하는 요점을 놓치지 마세요. 앞에서 언급해야합니다 ... 시간 초과 및 문제 해결을 지울 때 t를 null로 설정하기 만하면됩니다. – SuperDuperApps
@NigelPeck : 나는이 대답이 "질문에 대답 할 때 요점을 놓치는"것을 보지 못합니다. 원래 Asker의 문제에 대한 훌륭한 솔루션을 제공합니다. – Reid
시간 초과가 있는지 확인할 수있는 다른 방법이 있습니다. 타임 아웃을 유지하는 값은 기본적으로 시간에 따라 증가하는 숫자 값을가집니다.
if (someBooleanValue && !parseInt(@changeToCriteriaTimeout) > 0){
//Do something
}
그냥 시간 제한 기능에 (또는 t 귀하의 경우) t
0
에 설정 : 당신이 clearTimeout
를 사용하는 경우
timeoutID = 0;
가 타임 아웃을 설정 그래서 우리는 건설 "만일"에서 다음에 수행 할 수 있습니다 id를 0으로 설정하면 timeoutID === 0
을 확인하면 해당 값이 지워졌거나 완료되었는지 확인합니다. 일부 사용자처럼
훨씬 더 현명한 해결책 Gavin. 실제로 클리어 할 때 타임 아웃을 스스로 null로 제안하지 않고 래퍼 객체를 사용할 필요가 없습니다. 무엇이 더 간단할까요! – SuperDuperApps
는 타임 아웃이 중 (설정 시간이 경과 한 후) 트리거 또는 clearTimeout
와 삭제, false
바람직 null
에 수동으로 설정 될 때마다, 의견 제안합니다. 그런 다음 간단한 if-check를 수행하여 이것이 활성 상태인지 확인할 수 있습니다. 또한 필요한 경우 false
/null
으로 초기화해야합니다.
이의 작은 테스트 페이지를 만든 : https://codepen.io/TheJesper/pen/rJzava
도 참조 http://stackoverflow.com/questions/4021374/how-to-know-if-a-timer-is-cleared-or-timed -out-in-javascript – goodeye