2014-12-10 8 views
1

나는 웹에서 실행중인 카운트 다운 타이머와 데이터베이스의 주기적으로 변경 사항을 확인하는 두 번째 기능을 가지고 있지만, 타이머가 끝날 때 자주 체크 (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) { 
     ... 
    }); 
}; 

가 어쩌면 누군가를하는 데 도움이됩니다. 그리고 영어로 미안 해요 :)

+3

: 우리는 단지 우리가 지난 아약스 호출을 한 시간을 저장하는 변수 last_checked_date를 추가해야합니다. – Barmar

+12

'setInterval' 대신'setTimeout'을 사용하십시오. 그리고 그것을 함수 안에서 되 돌린다. – Yoshi

+0

감사합니다. @Yoshi. 아약스 호출이 1 초 이상 지속될 수 있다고 걱정합니다. StTime의 솔루션보다 setTimeout을 "안전"하게 사용하고 있습니까? – hovado

답변

0

텍스트를 업데이트하기 위해 이미 초마다 코드를 실행해야하기 때문에 새로운 ajax 호출을 만들기에 충분한 시간이 지나면 동일한 setInterval에서 매초마다 점검을 할 수 있습니다 . 당신은`clearInterval`와 이전`setInterval`을 취소하고 새로운 반복 속도 새로 시작해야

var days, hours, minutes, seconds, check_interval, last_checked_date = 0; 

setInterval(function() { 

    ... 

    if (hours > 0) { 
     check_interval = 60000; 
    } else if (hours = 0 && minutes > 5) { 
     check_interval = 10000; 
    } else { 
     check_interval = 3000; 
    } 

    if (current_date - last_checked_date > check_interval) { 
     // do ajax call 

     last_checked_date = current_date; 
    } 

}, 1000); 
+0

필자의 경우'current_date'가 1 초마다 업데이트되므로'date_end'는 타이머 끝의 고정 시간이기 때문에'if (date_end - last_checked_date> check_interval)'이어야합니다. 그러나이 해결책은 실제로 가장 간단합니다. 아약스 호출이 1 초 이상 지속되면 어떻게됩니까? – hovado

+0

예, current_date가 매초마다 업데이트되므로'current_date - last_checked_date'는 setInterval이 트리거 할 때마다 증가 할 것이고, 차이가'check_interval'보다 큰 경우 ajax를 실행할 시간입니다. 그래서 저는 제 모범이 옳다고 생각합니다. 아약스 호출에 1 초 이상 걸리는 경우 문제가되지 않지만 요청이 이미 진행중인 경우 아약스를 다시 호출하지 않는 것이 좋습니다. – Strille

관련 문제