2017-01-10 4 views
1

Der Timer wird angezeigt, als ob es eine Art Stopp nach Pause ist. Wenn ich aber auf "Weiter" klicke, finde ich heraus, dass der Counter weiterhin hinter der Szene läuft. Ich denke, es gibt Probleme mit setInterval. Bitte hilf mir. Mein Projekt auf CodePen als Referenz, wenn Sie brauchen.Der Timer stoppt nicht, nachdem die Pause-Taste angeklickt wurde

Meine Timer-Funktion

function timer(seconds) { 
    clearInterval(countdown); 
    const now = Date.now(); 
    const then = now + seconds * 1000; 
    displayTimerLeft(seconds); 
    console.log({ 
    now, 
    then 
    }); 
    countdown = setInterval(() => { 
    if (!isPaused) { 
     const remainSeconds = Math.round((then - Date.now())/1000); 
     if (remainSeconds < 0) { 
     clearInterval(countdown); 
     return; 
     } 
     displayTimerLeft(remainSeconds); 

    } 
    }, 1000); 

} 

Pause und starten Sie Click-Ereignisse

pause.addEventListener('click', function() { 
    isPaused = true; 
    return; 

}) 

start.addEventListener('click', function() { 
    isPaused = false; 
}) 
+1

Ein paar Hinweise. Erstens, benutze 'then' nicht als const. 'then' ist ein Schlüsselwort in js, das in 'if then' Anweisungen verwendet wird. Wenn js Probleme mit einem Element verursacht, überspringt es oft den Rest der Funktion. Wenn Sie also Ihren Variablennamen ändern, kann dies möglicherweise behoben werden. Sie sollten aber auch 'variable = undefined' verwenden, wenn Sie clearInterval (Variable) verwenden, sonst wird es nicht vollständig gelöscht. – EvSunWoodard

+0

Mögliches Duplikat von [Javascript - Pausieren setInterval()] (http://stackoverflow.com/questions/21277900/javascript-pausing-setinterval) – bobjoe

+0

@bobjoe Es ist kein Duplikat tatsächlich, das Problem kommt von ihm nicht mit einer Variablen um Sekunden zu zählen, aber den Endzeitstempel unverändert zu lassen, auch wenn er pausiert. Sein Code-Snippet ist fast genau so wie die Antwort in dem Post, den Sie verlinkt haben. –

Antwort

2

Behalten Sie einen Verweis auf die aktuelle Uhrzeit und fügen Sie bei jedem Tick manuell eine Sekunde hinzu.

function timer(seconds) { 
    clearInterval(countdown); 
    const t = new Date(); 
    const end = t.getTime() + seconds * 1000; 
    displayTimerLeft(seconds); 
    console.log({ 
    t, 
    end 
    }); 
    countdown = setInterval(() => { 
    if (!isPaused) { 
     const remainSeconds = Math.round((end - t.getTime())/1000); 
     if (remainSeconds < 0) { 
     clearInterval(countdown); 
     return; 
     } 
     displayTimerLeft(remainSeconds); 
     t.setSeconds(t.getSeconds() + 1); 
    } 
    }, 1000); 
} 

Demo: http://codepen.io/miguelmota/pen/wgMzXY

-2

setInterval gibt eine eindeutige ID, die verwendet werden können, mit dem Timer clearInterval zu stoppen:

var id = setInterval(function(){ 
console.log('running every 300 ms'); 
},300); 

clearInterval(id) // stop timer 
+0

Haben Sie die Frage gelesen? Er hat das getan. – EvSunWoodard

+1

Das würde funktionieren, aber dann wird zusätzlicher Code benötigt, um das Intervall bei Pause wieder aufzunehmen. – bobjoe

4

Suche Bei Ihrem Code, nehme ich an, das Problem ist, dass Sie die gleichebehaltenWert, der letztendlich ein Zeitstempel ist, zu dem der Timer enden sollte. Anstatt den Countdown zu pausieren, halten Sie jetzt an, dass sich die Anzeige nicht ändert.

Ich würde empfehlen, stattdessen Ihre Variable seconds (und Berechnung der Anzeige mit Modulo%), und verringern Sie es jede Sekunde. Auf diese Weise würde das Pausieren der Anzeige effektiv die Verringerung anhalten.

Verwandte Themen