2016-09-01 2 views
0

У меня немного проблемы с логикой здесь:Javascript обратный отсчет таймера логики

var seccount=60; 
var seccounter=setInterval(sectimer, 1000); 
function sectimer() { 
    seccount=seccount-1; 
    if (seccount < 0) { 
    seccount=59; 
    return; 
} 
document.getElementById("sectimer").innerHTML=seccount+ " seconds!"; 

Когда опустится до 0, таймер остается на 0 в течение 2 секунд, а затем переходит на 58 раз. Я попробовал несколько различных вещей, в функции, такие как:

function sectimer() { 
    seccount=seccount-1; 
    if (seccount <= 0) { 
    seccount=59; 
    return; 
} 

и

function sectimer() { 
    seccount=seccount-1; 
    if (seccount < 1) { 
    seccount=60; 
    return; 
} 

, но все имеет некоторые вариации, где таймер застывает на некоторое число в течение 2 секунд, а затем переходит к числу Я выбираю.

Что мне не хватает?

+0

возвращение; заставляет функцию выйти до обновления ui, поэтому ui не обновляется до отображения 59 и пропускает до 58 на следующем интервале. – Kenji

+0

Спасибо! Между вашим комментарием и ответом Славика я получил все, что мне нужно: решение и объяснение. – rjbogz

ответ

3

Возврат неуместен. Попробуйте это:

var seccount=60; 
var seccounter=setInterval(sectimer, 1000); 
function sectimer() { 
    seccount--; 
    if (seccount < 0) { 
     seccount=59; 
    } 
    document.getElementById("sectimer").innerHTML=seccount+ " seconds!"; 
} 

return вызвала функция быть немедленно прекращена, для этого, когда он входит в состояние if (seccount < 0) (в случае seccount является -1), то seccount не обновляется, чтобы быть 59, а затем он никогда достигает обновления элемента ниже, но заканчивается на return. Затем, в следующий раз, когда он запускается через секунду, seccount падает до 58, который явно не ниже нуля, и пропускает строку обновления элемента. Вот почему вы чувствуете, что потеряли 2 секунды, потому что вы пропустили одно обновление элемента времени :-)

+0

Работал отлично. Почему бы вернуть это? И почему возвращение не нужно? Большое спасибо! EDIT: @ Kenji ответил выше. Спасибо за информацию! – rjbogz

+0

Объясняется в ответе. –

0

Хм, я мог бы сделать это следующим образом;

function countDownFrom(n,lim = n){ 
 
    result.textContent = n + " seconds"; 
 
    setTimeout(countDownFrom,1000,n ? --n : lim-1,lim); 
 
} 
 
countDownFrom(5);
<p id="result"></p>