2011-04-27 10 views
15

una pregunta. Si uso setInterval de esta manera:javascript setInterval

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

¿Estoy a salvo que la función doSome() se activa cada 60 segundos, incluso si cambio de la pestaña en el navegador?

+6

Nunca se debe pasar una cadena a 'setInterval' sino una función:' setInterval (doSome, 60000); 'o si necesita argumentos, etc:' setInterval (function() {doSome (12345);}, 60000); ' – ThiefMaster

+0

por supuesto. le sugiero que lo escriba como setInterval (doSome, 60000), que es más eficiente. – gpilotino

+0

Las cadenas pasadas a 'setInterval' están bien. La diferencia es cómo se evalúan y de qué alcance. –

Respuesta

1

Si la pestaña con la función setInterval() permanece abierta, entonces sí, la función se ejecutará cada 60 segundos, incluso si cambia o abre otras pestañas.

0

Sí, el enfoque del navegador es irrelevante.

Sin embargo, no se debe utilizar una cadena de argumentos para setInterval. Utilice una referencia a la función en su lugar:

setInterval(doSome, 60000); 
+0

Las cadenas pasadas a 'setInterval' están bien. La diferencia es cómo se evalúan y de qué alcance. –

+0

@Delan Y la velocidad, y el resaltado de sintaxis, y la necesidad de hacer cosas estúpidas como escapar comillas. Pasar cadenas a 'setInterval' no es * wrong *, per se, simplemente brainless. – lonesomeday

+0

Eso es cierto, y estoy de acuerdo con usted. –

0

seguridad hora exacta No, no está garantizado. JS está basado en eventos (y single-threeaded) por lo que el evento no se activará en el momento exacto, especialmente si tiene otro código ejecutándose al mismo tiempo en su página.

El evento se disparará en el barrio del valor de tiempo establecido, pero no en la milésima de segundo exacta. El error puede ser decenas de milisegundos, incluso si no se está ejecutando ningún otro evento en ese momento. Esto puede ser un problema si, por ejemplo, tiene un proceso de larga duración donde el tiempo es importante. Si lo haces, necesitarás sincronizar con un reloj de vez en cuando.

0

Sí, va a ser llamado, siempre y cuando la página está abierta, independientemente de la pestaña se enciende o incluso el navegador se reduce al mínimo.

Sin embargo asegúrese de que no pases la función de una cadena a SetInterval

debería ser>

setInterval(doSome, 60000)

+0

Las cadenas pasadas a 'setInterval' están bien. La diferencia es cómo se evalúan y de qué alcance. –

+0

gracias, no lo sabía. – neebz

28

pasar una cadena a setInterval está bien, y es una de las dos formas de use setInterval, el otro pasa un puntero a la función. No está mal de ninguna manera como el estado de las otras respuestas, pero no es tan eficiente (como el código debe reparsed) ni es necesario para su propósito. Tanto

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

y

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

son correctos, aunque tienen un significado ligeramente diferente . Si doSome es local a un cierto margen no global, llamando a este último dentro del mismo ámbito de aplicación que se ejecute el local de doSome en 60000ms intervalos. Llamar al código anterior siempre buscará doSome en el alcance global, y fallará si no hay una función doSome en el alcance global.

La función será fiable ser activado, independientemente de la pestaña de enfoque, a intervalos de al menos 60000ms, pero por lo general un poco más debido a los gastos generales y los retrasos.

Todos los navegadores sujetan el valor del intervalo a por lo menos un cierto valor para evitar intervalos ser demasiado frecuente (creo que es un mínimo de 10 ms o 4 ms o algo así, no recuerdo exactamente).

Tenga en cuenta que algunos navegadores (la próxima Firefox 5 es una, pero es probable que haya otros que no lo sepa) sujetan más setInterval drásticamente a, por ejemplo, 1000 ms si la pestaña no está enfocada. (Reference)

+0

Una diferencia más: en la primera versión, puede cambiar el valor de la variable global 'doSome' y el intervalo comenzará a llamar a la nueva función. En la segunda versión no puedes hacer eso. –

2

No, el intervalo no puede ejecutarse hasta que se borre el bucle de evento, por lo que si lo hace, por ejemplo, setInterval(func, 1000); for(;;), el intervalo nunca se ejecutará. Si otras pestañas de navegadores se ejecutan en el mismo subproceso (como en todas partes (?) Excepto en chrome, se aplica lo mismo si esas pestañas obstruyen el bucle de evento.)

Pero para un intervalo tan grande como 60000 está en menos probable que se llame al func en un tiempo razonable. Pero no hay garantías.

0

Acerca de "seguridad de tiempo exacta": El siguiente código comienza UpdateAll a intervalos de RefreshInterval milisegundos, con ajuste cada segundo para que se produzca un inicio en cada segundo al comienzo del segundo. Habrá un ligero retraso para la velocidad finita de la computadora, pero los errores no se acumularán.

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. 
    } 
} 
Cuestiones relacionadas