¿Hay alguna diferencia?
Si. Un tiempo de espera ejecuta una cierta cantidad de tiempo después de llamar a setTimeout (); un intervalo ejecuta una cierta cantidad de tiempo después del disparo del intervalo anterior.
Notará la diferencia si su función doStuff () tarda un tiempo en ejecutarse. Por ejemplo, si representamos una llamada a setTimeout / setInterval con .
, un disparo del tiempo de espera / intervalo con *
y la ejecución del código JavaScript con [-----]
, las líneas de tiempo se verán así:
Timeout:
. * . * . * . * .
[--] [--] [--] [--]
Interval:
. * * * * * *
[--] [--] [--] [--] [--] [--]
La siguiente complicación es si se dispara un intervalo mientras JavaScript ya está ocupado haciendo algo (como manejar un intervalo anterior). En este caso, el intervalo se recuerda y ocurre tan pronto como el controlador anterior finaliza y devuelve el control al navegador. Entonces, por ejemplo, para un proceso doStuff () que a veces es corto ([-]) y a veces largo ([-----]):
. * * • * • * *
[-] [-----][-][-----][-][-] [-]
• representa un disparo de intervalo que no pudo ejecutar su código de inmediato, y se hizo pendiente en su lugar.
Por lo tanto, los intervalos intentan "ponerse al día" para volver a su horario. Pero no hacen cola una encima de la otra: solo puede haber una ejecución pendiente por intervalo. (¡Si todos se pusieran en cola, el navegador se quedaría con una lista cada vez mayor de ejecuciones pendientes!)
. * • • x • • x
[------][------][------][------]
x representa un disparo de intervalo que no se pudo ejecutar o quedar pendiente, por lo que se descartó.
Si su función doStuff () habitualmente tarda más en ejecutarse que el intervalo establecido, el navegador consumirá el 100% de la CPU que intenta repararla y puede volverse menos receptiva.
¿Cuál usas y por qué?
Chained-Timeout ofrece un espacio garantizado de tiempo libre para el navegador; Interval intenta garantizar que la función que ejecuta se ejecute lo más cerca posible de sus tiempos programados, a expensas de la disponibilidad de la interfaz de usuario del navegador.
Consideraría un intervalo para animaciones únicas que quería que fuera lo más suave posible, mientras que los tiempos de espera encadenados son más amables para las animaciones en curso que tendrían lugar todo el tiempo mientras se carga la página. Para usos menos exigentes (como un actualizador trivial disparando cada 30 segundos o algo así), puede usar cualquiera de los dos de manera segura.
En términos de compatibilidad del navegador, setTimeout es anterior a setInterval, pero todos los navegadores que conocerá hoy son compatibles con ambos. El último rezagado durante muchos años fue IE Mobile en WinMo <6.5, pero espero que eso también haya quedado atrás.