2009-12-29 13 views
11

¿Cómo gestiona setInterval las funciones de devolución de llamada que tardan más que el intervalo deseado?setInterval y funciones de larga duración

He leído que la devolución de llamada puede recibir el número de milisegundos tarde como primer argumento, pero no pude encontrar por qué sería tarde (jitter o funciones de larga ejecución).

Y el maravilloso seguimiento, ¿se comporta de manera diferente para los navegadores comunes?

+0

Buena pregunta. Sospecho que la respuesta es específica del navegador. ¿Deberíamos hacer algunas pruebas para averiguarlo? –

+0

No confiaría en recibir ningún argumento para la devolución de llamada. En cambio, use una comparación de fecha simple. Ese parece ser el enfoque más confiable y entre navegadores para mí. –

Respuesta

14

Vamos a citar un excelente article sobre temporizadores por John Resig:

setTimeout(function(){ 
    /* Some long block of code... */ 
    setTimeout(arguments.callee, 10); 
}, 10); 

setInterval(function(){ 
    /* Some long block of code... */ 
}, 10); 

Estas dos piezas de código pueden parecer ser funcionalmente equivalente, en un primer momento vista, pero no lo son. Cabe destacar que el código setTimeout siempre tendrá al menos un retraso de 10 ms después de la ejecución previa de devolución de llamada (que puede terminar ser más, pero nunca menos), mientras que el setInterval intentará ejecutar una devolución de llamada cada 10 ms independientemente del momento se ejecutó la última devolución de llamada .

Los intervalos pueden ejecutarse consecutivamente sin demora si tardan lo suficiente en ejecutarse (más tiempo que el retardo especificado).

+4

Por lo tanto, en pocas palabras, dado que el enhebrado de JavaScript tiene un solo hilo, las devoluciones de llamada no se pueden ejecutar en paralelo. Perfecto. –

Cuestiones relacionadas