2009-08-03 11 views

Respuesta

158

¿Quieres setInterval():

var intervalID = setInterval(function(){alert("Interval reached");}, 5000); 

El primer parámetro a setInterval() también puede ser una cadena de código para ser evaluados.

puede borrar una función periódica con:

clearInterval(intervalID); 
+14

Subí y luego decidí rescindir mi voto popular (pero no el voto a favor) porque está utilizando un argumento de cadena para establecer Intervalo. Las funciones casi siempre deben usarse a favor de un argumento de cadena, para la eficiencia, la seguridad y sus características de cierre. –

+2

Está bien, no me importa. 'setInterval()' es la respuesta correcta a la pregunta, sin importar el parámetro. Es solo un ejemplo, y ambos métodos son por definición correctos. – zombat

+2

Estoy de acuerdo con Jason S; realmente debería ser una función. En su ejemplo, el único problema es una pérdida de rendimiento insignificante, pero es un mal hábito entrar. –

1

Desde desea que la función que se ejecuta periódicamente , utilice setInterval

2
function test() { 
alert('called!'); 
} 
var id = setInterval('test();', 10000); //call test every 10 seconds. 
function stop() { // call this to stop your interval. 
    clearInterval(id); 
} 
+0

jaja, esta fue respondida rápidamente. heh. Lo siento por el doble post. –

14

Cada uno tiene una solución setInterval setTimeout/ya. Creo que es importante tener en cuenta que puede pasar funciones a setInterval, no solo cadenas. Es probable que sea un poco más "seguro" pasar funciones reales en lugar de cadenas que serán "evadidas" a esas funciones.

// example 1 
function test() { 
    alert('called'); 
} 
var interval = setInterval(test, 10000); 

O:

// example 2 
var counter = 0; 
var interval = setInterval(function() { alert("#"+counter++); }, 5000); 
+3

+1 Si eres un estudiante de la [escuela de JavaScript de Crockford] (http://javascript.crockford.com/code.html), evitas la evaluación en todas sus formas malvadas. –

+0

@Patrick - No creo que la sugerencia "No usar $ (signo de dólar) o \ (barra invertida) en los nombres" saldrá bien con el lote jQuery :) –

1

La forma nativa es de hecho setInterval()/clearInterval(), pero si usted ya está usando la biblioteca Prototype usted puede tomar ventaja de PeriodicalExecutor:

new PeriodicalUpdator(myEvent, seconds); 

Esto evita llamadas superpuestas. De http://www.prototypejs.org/api/periodicalExecuter:

"que le protege contra múltiples ejecuciones paralelas de la función de devolución de llamada, debe tomar más tiempo que el intervalo dado para ejecutar (que mantiene una interna‘funcionamiento’de la bandera, que está protegida contra excepciones en la devolución de llamada función). Esto es especialmente útil si usa uno para interactuar con el usuario a intervalos determinados (por ejemplo, usar un aviso o confirmar una llamada): esto evitará que múltiples cuadros de mensajes estén esperando ser activados ".

24

Tenga en cuenta que setInterval() a menudo no es la mejor solución para la ejecución periódica - Es muy depende de lo javascript en realidad estás llamando periódicamente.

por ejemplo. Si usa setInterval() con un período de 1000ms y en la función periódica realiza una llamada ajax que ocasionalmente tarda 2 segundos en regresar, hará otra llamada ajax antes de que la primera respuesta regrese. Esto generalmente no es deseable.

Muchas bibliotecas tienen métodos periódicos que protegen contra las trampas de usar setInterval ingenuamente, como el ejemplo de prototipo dado por Nelson.

Para lograr la ejecución periódica más robusto con una función que tiene una llamada ajax jQuery en ella, considere algo como esto:

function myPeriodicMethod() { 
    $.ajax({ 
    url: ..., 
    success: function(data) { 
     ... 
    }, 
    complete: function() { 
     // schedule the next request *only* when the current one is complete: 
     setTimeout(myPeriodicMethod, 1000); 
    } 
    }); 
} 

// schedule the first invocation: 
setTimeout(myPeriodicMethod, 1000); 

Otro enfoque es utilizar setTimeout pero medir el tiempo transcurrido en una variable y luego configure el tiempo de espera de cada invocación dinámicamente para ejecutar una función tan cerca del intervalo deseado como sea posible, pero nunca más rápido de lo que puede obtener respuestas de vuelta.

+0

setTimeout (myPeriodicMethod, 1000); se llama 2 veces. es requerido? Creo que el tiempo de espera establecido solo debe invocarse en la función completa –

+0

Sí, el segundo setTimeout() no es un requisito, simplemente puede llamar a myPeriodicMethod() que realizaría la primera llamada ajax inmediatamente ... pero si desea * programarlo * con un retraso desde la primera llamada que podría escribir como lo he escrito. –

1

Pregunta anterior pero ... También necesitaba un corredor de tareas periódicas y escribí TaskTimer. Esto también es útil cuando necesita ejecutar múltiples tareas en diferentes intervalos.

// Timer with 1000ms (1 second) base interval resolution. 
var timer = new TaskTimer(1000) 

// Add task(s) based on tick intervals. 
timer.addTask({ 
    name: 'job1',  // unique name of the task 
    tickInterval: 5, // run every 5 ticks (5 x interval = 5000 ms) 
    totalRuns: 10,  // run 10 times only. (set to 0 for unlimited times) 
    callback: function (task) { 
     // code to be executed on each run 
     console.log(task.name + ' task has run ' + task.currentRuns + ' times.'); 
    } 
}); 

// Start the timer 
timer.start(); 

TaskTimer funciona tanto en el navegador y el Nodo. Ver documentation para todas las funciones.

Cuestiones relacionadas