javascript setInterval

una domanda. Se uso setInterval in questo modo:

setInterval('doSome();',60000); 

Sono sicuro che la funzione doSome() viene triggersta ogni 60 secondi, anche se cambio la scheda in un browser?

Passare una stringa a setInterval va bene , ed è uno dei due modi per usare setInterval , l’altro è passare un puntatore a funzione. Non è sbagliato in alcun modo come l’altro risponde allo stato, ma non è efficiente (come il codice deve essere ripetuto) né è necessario per il tuo scopo. Entrambi

 setInterval('doSome();', 60000); // this runs doSome from the global scope // in the global scope 

e

 setInterval(doSome, 60000); // this runs doSome from the local scope // in the global scope 

sono corretti, sebbene abbiano un significato leggermente diverso . Se doSome è locale per un ambito non globale, chiamare quest’ultimo all’interno dello stesso ambito eseguirà il doSome locale a intervalli di 60000 ms. Chiamare il codice precedente cercherà sempre doSome nell’ambito globale e non riuscirà se non c’è alcuna funzione doSome nell’ambito globale.

La funzione verrà triggersta in modo affidabile, indipendentemente dalla tabulazione, ad intervalli di almeno 60000 ms , ma in genere leggermente più a causa di sovraccarichi e ritardi.

Tutti i browser bloccano il valore dell’intervallo ad almeno un certo valore per evitare che gli intervalli siano troppo frequenti (penso che sia un minimo di 10ms o 4ms o qualcosa del genere, non posso ricordare esattamente).

Si noti che alcuni browser (l’imminente Firefox 5 è uno, ma probabilmente ce ne sono altri che non conosco) ulteriori clamp setInterval drasticamente ad es. 1000ms se la scheda non è focalizzata. ( Riferimento )

No, l’intervallo non può essere eseguito fino a quando il ciclo degli eventi non viene cancellato, quindi se lo si fa, ad esempio, setInterval(func, 1000); for(;;) setInterval(func, 1000); for(;;) quindi l’intervallo non verrà mai eseguito. Se altre tabs di browser vengono eseguite nello stesso thread (come fanno ovunque (?) Tranne che in chrome, lo stesso si applica se tali tabs ostruiscono il ciclo degli eventi.)

Ma per un intervallo di 60000 è almeno molto probabile che la funzione verrà chiamata in un tempo ragionevole. Ma nessuna garanzia.

Se la scheda con la funzione setInterval() rimane aperta, allora sì la funzione verrà eseguita ogni 60 secondi, anche se si passa a o si aprono altre tabs.

Sì, funziona su un esempio che ho appena creato.

http://jsfiddle.net/5BAkx/

Sì, l’attenzione del browser è irrilevante.

Tuttavia, non si dovrebbe usare un argomento stringa per setInterval . Utilizzare invece un riferimento alla funzione:

 setInterval(doSome, 60000); 

No, non è garantita la sicurezza del tempo esatto. JS è basato su eventi (e su un solo capo), quindi l’evento non si triggers nel momento esatto, specialmente se si ha un altro codice in esecuzione contemporaneamente sulla pagina.

L’evento si attiverà in prossimità del valore temporale impostato, ma non sul millisecondo esatto. L’errore può essere di decine di millisecondi anche se nessun altro evento è in esecuzione al momento. Questo potrebbe essere un problema se ad esempio si ha un processo di lunga durata in cui i tempi sono importanti. Se lo fai, dovrai sincronizzarti con un orologio una volta ogni tanto.

Sì, verrà chiamato fino a quando la pagina è aperta, indipendentemente dal fatto che la scheda sia cambiata o anche il browser sia ridotto a icona.

Tuttavia assicurati di passare la funzione non una stringa a setInterval

dovrebbe essere>

setInterval(doSome, 60000)

Informazioni sulla “durata esatta della sicurezza”: il seguente codice avvia UpdateAll ad intervalli di RefreshInterval millisecondi, con aggiustamenti ogni secondo in modo che si verifichi un avvio ad ogni secondo all’inizio del secondo. Ci sarà un leggero ritardo per la velocità finita del computer, ma gli errori non si accumuleranno.

 function StartAtEachSecond () { var OneSecond = 1000; // milliseconds var MinInteral = 50; // milliseconds, estimated safe interval var StartTime = OneSecond - (new Date ()).getMilliseconds (); // Time until next second starts. if (StartTime < MinInteral) StartTime += OneSecond window.setTimeout (StartAtEachSecond, StartTime + MinInteral); // To set up the second after the next. for (var Delay = 0.0; Delay < OneSecond - MinInteral; Delay += RefreshInterval) { window.setTimeout (UpdateAll, StartTime + Delay); // Runs during the next second. } }