Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Проблема с таймером (https://javascript.ru/forum/dom-window/56481-problema-s-tajjmerom.html)

Balatsky 17.06.2015 23:12

Проблема с таймером
 
Привет, комрады. У меня никогда не было проблем с JS, знаю его на уровне любителя, но тут внезапно столкнулся с проблемой, которую не могу решить второй день. Вообщем, каждые 3 секунды делается запрос к серверу, сервер отдает кол-во секунд до определенного события. Я пытаюсь сделать таймер, но вместо этого создается куча таймеров, которые мне совсем не нужны. Какое будет самое оптимальное решение для этого?

Sigizmund2012 18.06.2015 07:22

Первое, что на ум пришло:
var timer = setInterval(function() {
    var req = new XMLHttpRequest();
    /* Обрабатываем запрос, если интервал больше не нужен, то clearInterval(timer) */
}, 3000);

Balatsky 18.06.2015 12:47

Запрос делается и постоянно обновляется переменная countdown (данные для этой переменной отдает сервер, это кол-во секунд). Надо, чтобы таймер брал значение постоянно из этой переменной и декрементил ее каждую секунду, при этом не создавая кучу инстансов. При этом у меня должна быть возможность его остановить.

Sigizmund2012 18.06.2015 13:48

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);

Balatsky 18.06.2015 15:38

Бывает так, что от сервера приходит 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);
					}
				}

Balatsky 19.06.2015 22:27

Вообщем, сделал бесконечный интервал. Всем спасибо.


Часовой пояс GMT +3, время: 13:22.