2013-09-23 16 views
6

Oto przykładowa sytuacja.Użyj zmiennej jako Czas w setInterval/setTimeout

var count, 
    time = 1000; 

setInterval(function(){ 
    count += 1; 
}, time); 

Powyższy kod doda 1 do "count" var, bardzo 1000 milisekund. Wygląda na to, że setInterval, po uruchomieniu, użyje czasu, który widzi podczas wykonywania. Jeśli ta wartość zostanie później zaktualizowana, nie uwzględni tego i będzie nadal uruchamiana po ustawionym czasie początkowym.

Jak mogę dynamicznie zmieniać czas dla tej metody?

+1

http://stackoverflow.com/questions/1280263/changing-the-interval-of-setinterval- while-its-running – Tomalla

Odpowiedz

7

Używaj setTimeout zamiast z zwrotnego i zmiennej zamiast numeru.

function timeout() { 
    setTimeout(function() { 
     count += 1; 
     console.log(count); 
     timeout(); 
    }, time); 
}; 
timeout(); 

Demo here

Krótsza wersja będzie:

function periodicall() { 
    count++; 
    setTimeout(periodicall, time); 
}; 
periodicall(); 
+3

Ten ma dla mnie najwięcej sensu :) – Panomosh

+0

@Panomosh, szczęśliwy, że mogłem pomóc :) – Sergio

0

liczby całkowite nie są przekazywane przez odniesienie w języku JavaScript, co oznacza, że ​​nie można zmienić przedziału, zmieniając zmienną.

Po prostu anuluj setInterval i ponownie uruchom go ponownie z nowym czasem.

Przykład można znaleźć tutaj: http://jsfiddle.net/Elak/yUxmw/2/

var Interval; 

(function() { 
    var createInterval = function (callback, time) { 
     return setInterval(callback, time); 
    } 

    Interval = function (callback, time) { 
     this.callback = callback; 
     this.interval = createInterval(callback, time); 
    }; 

    Interval.prototype.updateTimer = function (time) { 
     clearInterval(this.interval); 
     createInterval(this.callback, time); 
    }; 

})(); 

$(document).ready(function() { 
    var inter = new Interval(function() { 
     $("#out").append("<li>" + new Date().toString() + "</li>"); 
    }, 1000); 

    setTimeout(function() { 
     inter.updateTimer(500); 
    }, 2000); 
}); 
2

Spróbuj:

var count, 
    time = 1000, 
    intId; 
function invoke(){ 

    intId = setInterval(function(){ 
     count += 1; 
     if(...) // now i need to change my time 
     { 
      time = 2000; //some new value 
      intId = window.clearInterval(intId); 
      invoke(); 
     } 
    }, time); 

} 

invoke(); 

Nie można zmienić interwał dynamicznie, ponieważ jest ona ustawiona raz i czego nie powtórzysz kod setInterval. Więc co możesz zrobić, aby wyczyścić interwał i ponownie ustawić go, aby uruchomić. Możesz także użyć setTimeout z podobną logiką, ale używając setTimeout musisz zarejestrować timeout za każdym razem i nie musisz używać clearTimeout, chyba że chcesz przerwać pomiędzy. Jeśli zmieniasz czas za każdym razem, setTimeout ma więcej sensu.

var count, 
time = 1000; 

function invoke() { 
    count += 1; 
    time += 1000; //some new value 
    console.log('displ'); 
    window.setTimeout(invoke, time); 
} 
window.setTimeout(invoke, time); 
1

Nie możesz (o ile wiem) zmieniać przedziału dynamicznie. Chciałbym suggesst to zrobić z wywołań zwrotnych:

var _time = 1000, 
_out, 
_count = 0, 
yourfunc = function() { 
    count++; 
    if (count > 10) { 
     // stop 
     clearTimeout(_out); // optional 
    } 
    else { 
     // your code 
     _time = 1000 + count; // for instance 
     _out = setTimeout(function() { 
      yourfunc(); 
     }, _time); 
    } 
}; 
Powiązane problemy