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?
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?
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.
Sí que funciona en un ejemplo que acabo de crear.
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);
Las cadenas pasadas a 'setInterval' están bien. La diferencia es cómo se evalúan y de qué alcance. –
@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
Eso es cierto, y estoy de acuerdo con usted. –
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.
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)
Las cadenas pasadas a 'setInterval' están bien. La diferencia es cómo se evalúan y de qué alcance. –
gracias, no lo sabía. – neebz
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)
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. –
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.
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.
}
}
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
por supuesto. le sugiero que lo escriba como setInterval (doSome, 60000), que es más eficiente. – gpilotino
Las cadenas pasadas a 'setInterval' están bien. La diferencia es cómo se evalúan y de qué alcance. –