2016-12-03 3 views
0

Я экспериментирую с методом setInterval и clearInterval в Javascript, но у меня возникает проблема. То, что я пытаюсь сделать, состоит в том, что функция будет называться номинально каждые «х» секунд большую часть времени, но через определенные промежутки времени выполняется чаще. Я приложил немного кода, который является незавершенным голой костью того, что у меня есть до сих пор, что является простым доказательством концепции - в этом примере каждые 10 секунд отображаются минуты, иначе между 30 и 40 минутами (как фиктивные значения, чтобы увидеть, могу ли я заставить его работать), дисплей обновляется каждые 1 секунду. Но я понял, что не могу проверить, продолжает ли setInterval и как его снова перезапустить (как переменную myVar).Изменение Javascript setInterval

<!DOCTYPE html> 
<html> 
<body> 

<p id="demo">Just testing...</p> 

<script> 

var d = new Date(); 

myVar = setInterval(informUser, 10000); 

function informUser() 
{ 

if (d.getMinutes()>30 && d.getMinutes()<40) // every second 
{ 
    clearInterval(myVar); 
    mvVar = setInterval(informUser, 1000); 
    document.getElementById("demo").innerHTML = d.getMinutes();  
} 
else // else 10 seconds 
{ 
    document.getElementById("demo").innerHTML = d.getMinutes();  
} 

} 

</script> 

</body> 
</html> 

Как я уже сказал, код очень неполный, поскольку я столкнулся с кирпичной стеной! Как только у меня что-то работает, я могу сделать это немного сложнее. EDIT:

Спасибо за ваши комментарии к синтаксису, но это не проблема. Что делает код в данный момент, выводит минуты на экран каждые 10 секунд, пока не достигнут 31 минута прошедшего часа. Затем он останавливает таймер и запускает его с интервалом в 1 секунду. По прошествии 9 минут код останавливается, потому что таймер не запускается.

Что мне хотелось сделать в разделе «else // else 10 seconds», чтобы узнать, имеет ли myVar значение null; если это так, перезапустите таймер на 10 секунд.

+0

Обратите внимание, что первый параметр функции setInterval должен быть ** ссылкой ** на функцию (а не на вызов функции, если только этот вызов не возвращает ссылку на другую функцию). Вы должны использовать 'setInterval (informUser, X)' – Dekel

+0

Спасибо, я изменю его выше (если смогу) – user3713442

+0

Вы можете изменить, но это также ответ на ваш вопрос. Обновите его в своем собственном коде и проверьте. Он должен решить вашу проблему. – Dekel

ответ

1

Date объект создается за пределами функции и поэтому остается постоянной.

Продолжительность таймера не обновляется в блоке else.

Повторное включение таймера интервалов в каждом режиме может вызвать некоторые нечетные эффекты из-за дрейфа. Скорее, создайте один таймер с таймаутом, который является самым большим общим делителем обоих требуемых интервалов, подсчитайте его запуск и основывайте логику на этом счете.

interval = setInterval(informUser, 1000); 
intervalCount = 0; 

function informUser() { 
    var minutes = Date.now().getMinutes(); 
    intervalCount++; 

    if(minutes > 30 && minutes < 40) { 
     intervalCount = 0; 
     document.getElementById("demo").innerHTML = minutes; 
    } 
    else if (intervalCount >= 10) { 
     intervalCount = 0; 
     document.getElementById("demo").innerHTML = minutes; 
    } 

} 
0

Несколько вещей задают ваш вопрос непонятным.

«Посмотрите, все еще запущен setInterval». В принципе, он всегда работает, единственный раз, когда вы его останавливаете, - clearInterval, а затем вы начинаете его снова.

Аналогично, myVar никогда не будет пустым.

И в период с 31 по 39 вы действительно не используете «интервал» - вы очищаете его и каждый раз перезапускаете его.

Как об этом:

var d = new Date(); 

currInterval = 10000; 
myVar = setInterval(informUser, currInterval); 

function informUser() 
{ 
    document.getElementById("demo").innerHTML = d.getMinutes();  

    intervalShouldBe = 10000; 

    if (d.getMinutes()>30 && d.getMinutes()<40) 
     intervalShouldBe = 1000; 

    // stop and restart only when interval needs to change 
    if(currInterval != intervalShouldBe) { 

     clearInterval(myVar); 
     myVar = null; 
     myVar = setInterval(informUser, intervalShouldBe); 
     currInterval = intervalShouldBe; 
    } 
} 
Смежные вопросы