2013-09-23 14 views
6

Ecco una situazione di esempio.Usa variabile come orario in setInterval/setTimeout

var count, 
    time = 1000; 

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

Il codice sopra aggiungerà 1 al numero "count", molto 1000 millisecondi. Sembra che setInterval, quando attivato, userà il tempo che vede durante l'esecuzione. Se tale valore viene successivamente aggiornato, non lo terrà conto e continuerà a sparare con l'ora iniziale impostata.

Come è possibile modificare in modo dinamico l'ora per questo metodo?

+1

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

risposta

7

Usa setTimeout invece con un callback e una variabile al posto del numero.

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

Demo here

versione più breve potrebbe essere:

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

Questo ha più senso per me :) – Panomosh

+0

@Panomosh, felice di poter aiutare :) – Sergio

0

Gli interi non vengono passati per riferimento in JavaScript, ovvero non è possibile modificare l'intervallo modificando la variabile.

Basta annullare setInterval e riavviarlo di nuovo con la nuova ora.

esempio può essere trovato qui: 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

Prova:

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(); 

Non è possibile modificare l'intervallo dinamico quanto è impostata una volta e poi tu non rieseguire nuovamente il codice setInterval. Quindi, cosa puoi fare per cancellare l'intervallo e di nuovo impostarlo per l'esecuzione. È inoltre possibile utilizzare setTimeout con logica simile, ma utilizzando setTimeout è necessario registrare un timeout ogni volta e non è necessario utilizzare eventualmente clearTimeout a meno che non si voglia interrompere in mezzo. Se stai cambiando il tempo ogni volta, allora setTimeout ha più senso.

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

non puoi (per quanto ne so) modificare l'intervallo dinamico. Vorrei suggesst a che fare questo con le richiamate:

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); 
    } 
}; 
Problemi correlati