2009-08-03 19 views

risposta

158

Volete setInterval():

var intervalID = setInterval(function(){alert("Interval reached");}, 5000); 

Il primo parametro da setInterval() può anche essere una stringa di codice da valutare.

è possibile cancellare una funzione periodica con:

clearInterval(intervalID); 
+14

Ho eseguito l'upsup e quindi ho deciso di annullare il mio upvote (ma non di downvoting) perché si sta utilizzando un argomento stringa per impostareInterval. Le funzioni dovrebbero quasi sempre essere utilizzate a favore di un argomento stringa, per efficienza, sicurezza e per le loro caratteristiche di chiusura. –

+2

Va bene, non mi dispiace. 'setInterval()' è la risposta corretta alla domanda, indipendentemente dal parametro. È solo un esempio ed entrambi i metodi sono per definizione corretti. – zombat

+2

Sono d'accordo con Jason S; dovrebbe davvero essere una funzione. Nel tuo esempio, l'unico problema è una perdita di prestazioni trascurabile, ma è una cattiva abitudine entrare. –

3

sì - dare un'occhiata a setInterval and setTimeout per l'esecuzione del codice in determinati momenti. setInterval sarebbe quello da utilizzare per eseguire periodicamente il codice.

Consulta l'demo and answer here per l'utilizzo

1

Dal momento che si desidera che la funzione da eseguire periodicamente , utilizzare setInterval

2
function test() { 
alert('called!'); 
} 
var id = setInterval('test();', 10000); //call test every 10 seconds. 
function stop() { // call this to stop your interval. 
    clearInterval(id); 
} 
+0

lol questo è stato risposto rapidamente. eh. scusa per il doppio post. –

14

Ognuno ha già una soluzione setInterval setTimeout /. Penso che sia importante notare che è possibile passare le funzioni a setInterval, non solo alle stringhe. In realtà è probabilmente un po 'più "sicuro" per passare funzioni reali invece di stringhe che saranno "valutate" a quelle funzioni.

// example 1 
function test() { 
    alert('called'); 
} 
var interval = setInterval(test, 10000); 

Oppure:

// example 2 
var counter = 0; 
var interval = setInterval(function() { alert("#"+counter++); }, 5000); 
+3

+1 Se sei uno studente della [scuola Crockford di JavaScript] (http://javascript.crockford.com/code.html), eviti la valutazione in tutte le sue forme malvagie. –

+0

@Patrick - Non penso che il suggerimento "Non usare $ (segno di dollaro) o \ (backslash) nei nomi" vada bene con il lotto jQuery :) –

1

Il modo nativo è davvero setInterval()/clearInterval(), ma se si sta già utilizzando la libreria Prototype si può usufruire di PeriodicalExecutor:

new PeriodicalUpdator(myEvent, seconds); 

questo modo si evita chiamate sovrapposte. Da http://www.prototypejs.org/api/periodicalExecuter:

"che ti protegge contro molteplici esecuzioni parallele della funzione di callback, dovrebbe richiedere più tempo rispetto al dato intervallo di esecuzione (che mantiene un interno‘in esecuzione flag’, che è schermato contro eccezioni nel callback funzione). Ciò è particolarmente utile se si utilizza uno per interagire con l'utente a intervalli specifici (ad esempio, utilizzare un prompt o una chiamata di conferma): questo eviterà che più caselle di messaggio siano in attesa di essere eseguite. "

24

prega di notare che setInterval() non è spesso la soluzione migliore per l'esecuzione periodica - E 'davvero dipende da quello che si sta effettivamente javascript chiamando periodicamente.

es. Se si utilizza setInterval() con un periodo di 1000 ms e nella funzione periodica si effettua una chiamata ajax che richiede occasionalmente 2 secondi per tornare, si effettuerà un'altra chiamata ajax prima che la prima risposta torni indietro. Questo di solito è indesiderabile.

Molte biblioteche hanno metodi periodiche che proteggono contro le insidie ​​di utilizzare setInterval ingenuamente come il prototipo esempio dato da Nelson.

Per ottenere più robusta l'esecuzione periodica di una funzione che ha un ajax chiamata jQuery in esso, si consideri qualcosa di simile:

function myPeriodicMethod() { 
    $.ajax({ 
    url: ..., 
    success: function(data) { 
     ... 
    }, 
    complete: function() { 
     // schedule the next request *only* when the current one is complete: 
     setTimeout(myPeriodicMethod, 1000); 
    } 
    }); 
} 

// schedule the first invocation: 
setTimeout(myPeriodicMethod, 1000); 

Un altro approccio è quello di utilizzare setTimeout ma tenere traccia del tempo trascorso in una variabile e quindi impostare il ritardo di timeout su ogni chiamata dinamicamente per eseguire una funzione il più vicino possibile all'intervallo desiderato, ma mai più veloce di quanto si possa ottenere.

+0

setTimeout (myPeriodicMethod, 1000); si chiama 2 volte. è richiesto? Penso che il timeout impostato dovrebbe essere chiamato solo nella funzione completa –

+0

Sì, il secondo setTimeout() non è un requisito, si potrebbe semplicemente chiamare myPeriodicMethod() che eseguirà immediatamente la prima chiamata ajax ... ma se si desidera * programmalo * con un ritardo dalla prima chiamata che potresti scrivere come ho scritto. –

1

Vecchia domanda ma .. Avevo anche bisogno di un periodico task runner e scrivevo TaskTimer. Ciò è utile anche quando è necessario eseguire più attività su intervalli diversi.

// Timer with 1000ms (1 second) base interval resolution. 
var timer = new TaskTimer(1000) 

// Add task(s) based on tick intervals. 
timer.addTask({ 
    name: 'job1',  // unique name of the task 
    tickInterval: 5, // run every 5 ticks (5 x interval = 5000 ms) 
    totalRuns: 10,  // run 10 times only. (set to 0 for unlimited times) 
    callback: function (task) { 
     // code to be executed on each run 
     console.log(task.name + ' task has run ' + task.currentRuns + ' times.'); 
    } 
}); 

// Start the timer 
timer.start(); 

TaskTimer funziona sia nel browser che nel nodo. Vedi documentation per tutte le funzionalità.

Problemi correlati