나는 웹에서 실행중인 카운트 다운 타이머와 데이터베이스의 주기적으로 변경 사항을 확인하는 두 번째 기능을 가지고 있지만, 타이머가 끝날 때 자주 체크 (3 초마다)하고 타이머를 시작할 때 자주 체크하지 않는 것이 중요합니다. 나는 다음과 같은 코드를 가진다 :점진적으로 setInterval을 가속화하는 방법은 무엇입니까?
var days, hours, minutes, seconds, check_interval;
setInterval(function() {
var current_date = new Date().getTime();
var seconds_left = (date_end - current_date)/1000;
days = parseInt(seconds_left/86400);
seconds_left = seconds_left % 86400;
hours = parseInt(seconds_left/3600);
seconds_left = seconds_left % 3600;
minutes = parseInt(seconds_left/60);
seconds = parseInt(seconds_left % 60);
document.getElementById('countdown').innerHTML = days + 'd ' + hours + 'h ' + minutes + 'm ' + seconds + 's';
if (hours > 0) {
check_interval = 60000;
} else if (hours = 0 && minutes > 5) {
check_interval = 10000;
} else {
check_interval = 3000;
}
var check_bids = setInterval(function() {
$.ajax({
type: 'POST',
url: '/check.class.php',
dataType: 'json',
data: { ... }
}).done(function(response) {
...
}).fail(function(jqXHR, textStatus, errorThrown) {
console.log('Bids check failed: '+textStatus, errorThrown);
});
}, check_interval); // Accelerating interval
}, 1000);
나는 원하는대로 동작하지만, 나는이 두 가지 setInteval 기능을 결합 할 수 있는지 잘 모르겠다. 그게 효과적일까요? 충고에 감사하다.
UPDATE : Strille에
덕분에, 나는 마침내 하나의 setInterval을이 간단한 솔루션을 선택합니다
var days, hours, minutes, seconds;
setInterval(function() {
var current_date = new Date().getTime();
var seconds_left = seconds_to_end = (date_end - current_date)/1000;
days = parseInt(seconds_left/86400);
seconds_left = seconds_left % 86400;
hours = parseInt(seconds_left/3600);
seconds_left = seconds_left % 3600;
minutes = parseInt(seconds_left/60);
seconds = parseInt(seconds_left % 60);
document.getElementById('countdown').innerHTML = days + 'd ' + hours + 'h ' + minutes + 'm ' + seconds + 's';
if (hours > 0) { // If time to end is greater than 1 hour repeat ajax call every 60 seconds etc.
repeat_every_x_seconds = 60;
} else if (minutes > 5) {
repeat_every_x_seconds = 10;
} else {
repeat_every_x_seconds = 3;
}
if (parseInt(seconds_to_end) % repeat_every_x_seconds == 0) {
check(); // Call this function every x seconds.
}
}, 1000);
var check = function() {
$.ajax({
type: 'POST',
url: '/check.class.php',
dataType: 'json',
data: { ... }
}).done(function(response) {
...
}).fail(function(jqXHR, textStatus, errorThrown) {
...
});
};
가 어쩌면 누군가를하는 데 도움이됩니다. 그리고 영어로 미안 해요 :)
: 우리는 단지 우리가 지난 아약스 호출을 한 시간을 저장하는 변수
last_checked_date
를 추가해야합니다. – Barmar'setInterval' 대신'setTimeout'을 사용하십시오. 그리고 그것을 함수 안에서 되 돌린다. – Yoshi
감사합니다. @Yoshi. 아약스 호출이 1 초 이상 지속될 수 있다고 걱정합니다. StTime의 솔루션보다 setTimeout을 "안전"하게 사용하고 있습니까? – hovado