2011-11-14 6 views

Odpowiedz

103

Jeśli przez "restart", ty oznacza rozpoczęcie nowego 4-sekundowego okresu w tym momencie, następnie musisz zatrzymać i ponownie uruchomić timer.

function myFn() {console.log('idle');} 

var myTimer = setInterval(myFn, 4000); 

// Then, later at some future time, 
// to restart a new 4 second interval starting at this exact moment in time 
clearInterval(myTimer); 
myTimer = setInterval(myFn, 4000); 

Można też użyć trochę timera obiekt, który oferuje funkcję Reset:

function Timer(fn, t) { 
    var timerObj = setInterval(fn, t); 

    this.stop = function() { 
     if (timerObj) { 
      clearInterval(timerObj); 
      timerObj = null; 
     } 
     return this; 
    } 

    // start timer using current settings (if it's not already running) 
    this.start = function() { 
     if (!timerObj) { 
      this.stop(); 
      timerObj = setInterval(fn, t); 
     } 
     return this; 
    } 

    // start with new interval, stop current interval 
    this.reset = function(newT) { 
     t = newT; 
     return this.stop().start(); 
    } 
} 

Zastosowanie:

var timer = new Timer(function() { 
    // your function here 
}, 5000); 


// switch interval to 10 seconds 
timer.reset(10000); 

// stop the timer 
timer.stop(); 

// start the timer 
timer.start(); 

demo robocza: https://jsfiddle.net/jfriend00/t17vz506/

+0

Piękny obiekt, zawsze czuję się dobrze, gdy widzę kogoś używającego OOP w javascript! – Fortin

8

Po wyczyszczeniu przedziału za pomocą clearInterval można ponownie setInterval. Oraz w celu uniknięcia powtarzania zwrotna uzewnętrznić go jako oddzielną funkcję:

var ticker = function() { 
    console.log('idle'); 
}; 

następnie:

var myTimer = window.setInterval(ticker, 4000); 

wtedy, gdy zdecydujesz się na ponowne uruchomienie:

window.clearInterval(myTimer); 
myTimer = window.setInterval(ticker, 4000); 
+0

ale jak? clearInterval (myTimer), a następnie setInterval (myTimer, 4000) nie działa :( –

+0

@RikdeVos, dlaczego to nie działa? Nie jest to również 'setInterval (myTimer, 4000)', powinno to być 'setInterval (ticker, 4000); '. –