컴퓨터가 절전 모드가되면 setTimeout은 어떻게됩니까?
최신 웹 브라우저에서 setTimeout
10 분 (12시) 동안 a 를 수행 하고 5 분 후에 컴퓨터를 절전 모드로 전환한다고 가정합니다. 시스템이 다시 깨어 나면 어떻게됩니까? 10 분이되기 전에 (12:09에) 깨어나거나 훨씬 늦게 (16:00에) 깨어 나면 어떻게됩니까?
내가 묻는 이유는 10 분마다 새 인증 토큰을 요청하고 싶기 때문에 브라우저가 올바른 작업을 수행하고 오랜 시간이 지나면 새 토큰을 즉시 요청할지 확실하지 않기 때문입니다. 시각.
설명 : 쿠키를 사용하고 싶지 않습니다. 여기에서 웹 서비스를 구축하려고합니다. 예, 서버는 오래되고 유효하지 않은 토큰을 거부합니다.
내가 테스트 한 한, 컴퓨터가 깨어 난 후 중지되고 다시 시작됩니다. 나는 setTimeout/Interval
컴퓨터가 잠들었을 때부터 카운터 틱에 따라 세션을 의미한다고 생각합니다 .
setTimeout/Interval
시간이 중요한 일 의 정확성에 의존해서는 안된다고 생각합니다 . Google 크롬의 경우 최근 에 활성화 된 탭이 초점을 잃으면 시간 제한 / 간격 (1 초 미만)이 1 초에 한 번 느려진다는 사실을 발견 했습니다.
그 외에도 타임 아웃 / 간격의 정확성은 실행중인 다른 기능 등에 따라 달라집니다. 간단히 말해서 그다지 정확하지 않습니다.
따라서 간격 및 시간 제한을 사용하여 시작된 함수 내에서 시작 시간과 비교하여 시간을 확인하면 정확도가 향상됩니다. 이제 12시에 시작하면 컴퓨터가 절전 모드로 전환되고 16:13 정도에 깨어납니다. 16:13과 12:00을 확인하면 토큰을 갱신해야합니다. 시간 비교 사용의 예는 여기 에서 찾을 수 있습니다.
다음과 같이 현재 날짜 시간과 페이지가로드 된 날짜 시간을 비교합니다.
//Force refresh after x minutes.
var initialTime = new Date();
var checkSessionTimeout = function () {
var minutes = Math.abs((initialTime - new Date()) / 1000 / 60);
if (minutes > 20) {
setInterval(function () { location.href = 'Audit.aspx' }, 5000)
}
};
setInterval(checkSessionTimeout, 1000);
동작은 브라우저와 운영 체제 모두를 기반으로합니다. OS는 절전 모드를 처리하고 개별 앱은 종종이를 고려하지 않습니다.
가장 가능성이 높은 것은 OS가 종료되었을 때와 동일한 시간 동안 타이머에 남아있는 상태로 다시 돌아 오는 것입니다. 또 다른 가능성은 전혀 발사되지 않을 것이라는 것입니다.
정말로 우려된다면 미안하는 것보다 더 안전하고 토큰이 초기화 된 시간 스탬프를 저장하고 setInterval
주기적으로 (예 : 1 분에 두 번) 확인하는 데 사용하고 싶을 것입니다 .
그러나 보안은 단지 클라이언트 측의 것이어서는 안됩니다. 오래되었거나 유효하지 않은 토큰이 사용 된 경우 서버에서 오류가 발생하고 Ajax가 응답으로 적절하게 작동하는지 확인하십시오.
나는 다음 틱에 즉시 실행될 수 있다는 다른 포스트에 동의합니다. Resig의 블로그 게시물은 매우 좋습니다.
내 코드는 다음과 같습니다.
<!doctype html>
<html>
<body>
<input type="button" name="clickMe" id="colourButton" value="Start Timer" onclick="setTimeout('alert(\'Surprise!\')', 120000)"/>
</body>
<script>
</script>
</html>
질문에 답할 수있는 세 가지 시나리오를 사용했습니다.
시나리오 1 : 00 초에 '타이머 시작'버튼을 클릭합니다. 25 초에 컴퓨터가 잠들었습니다. 1 분 40 초에 컴퓨터를 깨 웁니다. 2 분에 경고가 표시됩니다.
시나리오 2 : 00 초에 '타이머 시작'버튼을 클릭합니다. 26 초에 컴퓨터가 잠들었습니다. 3 분 후에 컴퓨터를 깨 웁니다. 경고가 표시됩니다.
시나리오 3 : 이것은 정말 놀랍습니다.
<input type="button" name="clickMe" id="colourButton" value="Start Timer" onclick="setTimeout('alert(\'Surprise!\')', 600000)"/>
00 초에 '타이머 시작'버튼을 클릭합니다. 약 1 분 30 초에 컴퓨터가 최대 절전 모드에 있습니다 (내 PC는 최대 절전 모드를 시작하는 데 1 분 정도 걸립니다).
8 분 후에 노트북을 켭니다. 정확히 10 분에 경고가 나타납니다.
PS: This is my first ever comment on Stack Exchange. I prefer to execute code and view results rather than infer from theory.
여러 시나리오에서 JavaScript 타이머 (setTimeout)의 동작.
- 스레드가 사용 가능하고 시간 초과가 발생하는 경우 : 시간 초과 직후 타이머가 시작됩니다. 약 0-5ms의 특정 부정확성을 가질 수 있습니다 (일반적인 시나리오).
- 스레드가 타이머 시간 초과를 통과하기에 충분히 긴 시간 (거대한 루프) 일 때 : 스레드가 해제 된 직후 타이머가 실행됩니다.
- 경고가있는 경우 : 2와 동일한 동작입니다.
- 랩톱이 잠자기 상태가되어 스레드가 일시 중지 된 경우 : 몇 가지를 보았습니다. 그러나 가장 흔한 것은 완전히 부정확하고 수면 중에 보내는 시간을 무시하는 것입니다.
JavaScript의 타이머는 CPU 틱을 기반으로하고 CPU가 절전 모드이므로 타이머가 완전히 일시 중지되고 '아무 일도 일어나지 않았으므로'재개됩니다.
Ben의 대답에 따라 다음 유틸리티를 만들었습니다. 샘플링 기간을 조정할 수 있지만 토큰 새로 고침을 위해 다음과 같이 사용합니다.
const absoluteSetInterval = (handler, timeout) => {
let baseTime = Date.now();
const callHandler = () => {
if (Date.now() - baseTime > timeout) {
baseTime = Date.now();
handler();
}
};
return window.setInterval(callHandler, 1000);
};
const absoluteClearInterval = (handle) => window.clearInterval(handle);
In John Resig's blog the timers are said to be using "wall clock". I believe that the events will fire immediately after the machine is resumed because setTimeout() doesn't guarantee an execution is a specific point in time but as soon as possible after the specified interval. However, I haven't checked it myself.
'programing tip' 카테고리의 다른 글
PHP : mysql_real_escape_string이 사용자 입력을 정리하기에 충분합니까? (0) | 2020.12.13 |
---|---|
정규식 오류-반복 할 사항 없음 (0) | 2020.12.13 |
파일에 안전하게 쓰는 Python 다중 처리 (0) | 2020.12.12 |
SCRIPT438 : 개체가 속성 또는 메서드 IE를 지원하지 않습니다. (0) | 2020.12.12 |
Cygwin 32 비트에서 Cygwin 64 비트로 전환하는 것이 좋습니까? (0) | 2020.12.12 |