Проблема с таймером
Привет, комрады. У меня никогда не было проблем с 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, время: 13:22. |