Проблема с таймером
Привет, комрады. У меня никогда не было проблем с JS, знаю его на уровне любителя, но тут внезапно столкнулся с проблемой, которую не могу решить второй день. Вообщем, каждые 3 секунды делается запрос к серверу, сервер отдает кол-во секунд до определенного события. Я пытаюсь сделать таймер, но вместо этого создается куча таймеров, которые мне совсем не нужны. Какое будет самое оптимальное решение для этого?
|
Первое, что на ум пришло:
var timer = setInterval(function() {
var req = new XMLHttpRequest();
/* Обрабатываем запрос, если интервал больше не нужен, то clearInterval(timer) */
}, 3000);
|
Запрос делается и постоянно обновляется переменная countdown (данные для этой переменной отдает сервер, это кол-во секунд). Надо, чтобы таймер брал значение постоянно из этой переменной и декрементил ее каждую секунду, при этом не создавая кучу инстансов. При этом у меня должна быть возможность его остановить.
|
Balatsky,
Не очень понятно, чего вы хотите сделать, предположил, что от сервера вы получаете данные в json, вот примерное решение.
var countdown;
var timer = setInterval(function() {
var xhr = new XMLHttpRequest();
var obj;
xhr.open('GET', 'script.php', true);
xhr.send();
xhr.onreadystatechange = function() {
if (xhr.readyState != 4) return;
obj = JSON.parse(xhr.responseText);
countdown = obj.countdown; // Получаем значение countdown от сервера
};
}, 3000);
var countDecrement = setInterval(function() {
countdown--; // Декрементим countdown
if (countdown < 1) {
clearInterval(countDecrement); // Останавливаем интервал, если countdown меньше 1
}
}, 1000);
|
Бывает так, что от сервера приходит 0, в это время таймер идти не должен.
// каждые 3 секунды, когда парсится ответ от сервера
if(data.is_started != false & data.is_closed == false) {
if($countdown != 0 & timer == null)
timer = setTimeout(countdown, 996);
}
// отдельная функция
function countdown() {
$countdown--;
console.log($countdown);
var minutes = ($countdown / 60).toFixed(0);
var seconds = $countdown % 60;
$('#timer').html(minutes + ':' + seconds);
if($countdown == 0) {
clearTimeout(timer);
timer = null;
} else {
timer = setTimeout(countdown, 996);
}
}
|
Вообщем, сделал бесконечный интервал. Всем спасибо.
|
| Часовой пояс GMT +3, время: 08:26. |