C'è qualche differenza?
Sì. Un timeout esegue un determinato periodo di tempo dopo la chiamata di setTimeout (); un intervallo esegue un certo periodo di tempo dopo l'intervallo precedente attivato.
Noterai la differenza se la tua funzione doStuff () richiede del tempo per essere eseguita. Ad esempio, se rappresentiamo una chiamata a setTimeout / setInterval con .
, l'attivazione del timeout / intervallo con *
e l'esecuzione del codice JavaScript con [-----]
, le linee temporali appaiono come:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
La prossima complicazione è se un intervallo scatta mentre JavaScript è già occupato a fare qualcosa (come gestire un intervallo precedente). In questo caso, l'intervallo viene ricordato e si verifica non appena il gestore precedente termina e restituisce il controllo al browser. Ad esempio, per un processo doStuff () che a volte è breve ([-]) e talvolta lungo ([-----]):
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
• rappresenta un intervallo di attivazione che non è stato in grado di eseguire immediatamente il suo codice ed è stato invece sospeso.
Quindi gli intervalli cercano di "recuperare" per tornare nei tempi previsti. Ma non si mettono in coda uno sopra l'altro: può esserci solo una esecuzione in sospeso per intervallo. (Se fossero tutti in coda, il browser verrebbe lasciato con un elenco in continua espansione di esecuzioni eccezionali!)
. * • • x • • x
[------][------][------][------]
x rappresenta un intervallo di attivazione che non può essere eseguito o reso in sospeso, quindi è stato scartato.
Se la tua funzione doStuff () impiega abitualmente più tempo dell'esecuzione rispetto all'intervallo impostato, il browser consumerà il 100% della CPU nel tentativo di ripararla e potrebbe diventare meno reattivo.
Quale usi e perché?
Chained-Timeout offre uno slot di tempo libero garantito al browser; L'intervallo cerca di garantire che la funzione in esecuzione venga eseguita il più vicino possibile agli orari pianificati, a scapito della disponibilità dell'interfaccia utente del browser.
Considererei un intervallo per le animazioni una tantum che volevo essere il più fluido possibile, mentre i timeout concatenati sono più educati per le animazioni in corso che si verificherebbero continuamente mentre la pagina viene caricata. Per usi meno impegnativi (come un banale programma di aggiornamento che si attiva ogni 30 secondi o qualcosa del genere), puoi tranquillamente utilizzare entrambi.
In termini di compatibilità del browser, setTimeout precede setInterval, ma tutti i browser che incontrerai oggi supportano entrambi. L'ultimo sbandato per molti anni è stato IE Mobile in WinMo <6.5, ma speriamo che anche questo sia alle spalle.