2009-08-07 10 views
16

tengo una ajax javascript método que extrae datos de una página, etc.¿Quieres una función JavaScript para funcionar cada minuto, pero Max 3 veces

Quiero que este proceso se ejecute en un intervalo de tiempo, por ejemplo cada minuto. Pero no quiero que se repita para siempre, así que maximiza 3 veces.

¿Cuál es la mejor manera de implementar esto?

+0

rápido y sucio, pero ¿por qué no simplemente tener un incremento de contador cada vez que se ejecuta la solicitud y si (contador <3) {intervalRun();}? – Optimate

+0

@optimate: ¿Qué es intervalRun()? – Nosredna

+0

Quería decir 'setInterval'. – SLaks

Respuesta

40

De esta manera:

var runCount = 0;  
function timerMethod() { 
    runCount++; 
    if(runCount > 3) clearInterval(timerId); 

    //... 
} 

var timerId = setInterval(timerMethod, 60000); //60,000 milliseconds 
+3

+1 - esta es la mejor solución. Con 'setInterval()' evita invocar continuamente 'setTimeout()' una y otra vez, y el tiempo de bucle de 'foo()' es un poco más rápido porque no tiene que esperar a que 'foo()' procese todo antes configurando la próxima llamada. – zombat

+0

@zombat En realidad, setTimeout() suele preferirse en muchos escenarios a setInterval(), sobre todo porque setInterval() llamará a la función 60 segundos después de que la primera función * comenzó a ejecutarse *, no finalizó. Especialmente ahora que Chrome y Firefox están limitando las pestañas de fondo, setInterval() es mucho más confiable si no quieres apilar las tres llamadas a la vez. –

1

Puede usar setInterval() y luego dentro de la función llamada contar cuántas veces ha ejecutado la función y luego borrarInterval().

O puede usar setTimeout() y luego dentro de la función llamada llamada setTimeout() nuevamente hasta que lo haya hecho 3 veces.

0
var testTimeInt = 3; 
function testTime(){ 

    testTimeInt--; 

    if(testTimeInt>0) 
     setTimeOut("testTime()", 1000); 

} 


setTimeOut("testTime()", 1000); 
2

Uso setInterval, asegúrese de obtener una referencia.

var X=setInterval(....); 

Además, tienen un contador global

var c=0; 

Dentro de la función llamada por el setIntervale hacer:

c++; 
if(c>3) window.clearInterval(X); 
4

Un enfoque reutilizable

function setMaxExeuctionInterval(callback, delay, maxExecutions) 
{ 
    var intervalCallback = function() 
    { 
    var self = intervalCallback; 
    if ('undefined' == typeof self.executedIntervals) 
    { 
     self.executedIntervals = 1; 
    } 
    if (self.executedIntervals == maxExecutions) 
    { 
     clearInterval(self.interval) 
    } 
    self.executedIntervals += 1; 
    callback(); 
    }; 
    intervalCallback.interval = setInterval(intervalCallback, delay); 
} 

// console.log requires Firebug 
setMaxExeuctionInterval(function(){ console.log('hi');}, 700, 3); 
setMaxExeuctionInterval(function(){ console.log('bye');}, 200, 8); 
12

Un cierre de base solución, usando.210 y clearInterval():

// define a generic repeater 
var repeater = function(func, times, interval) { 
    var ID = window.setInterval(function(times) { 
    return function() { 
     if (--times <= 0) window.clearInterval(ID); 
     func(); 
    } 
    }(times), interval); 
}; 

// call the repeater with a function as the argument 
repeater(function() { 
    alert("stuff happens!"); 
}, 3, 60000); 

EDIT: Otra forma de expresar la misma, utilizando setTimeout() lugar:

var repeater = function(func, times, interval) { 
    window.setTimeout(function(times) { 
    return function() { 
     if (--times > 0) window.setTimeout(arguments.callee, interval); 
     func(); 
    } 
    }(times), interval); 
}; 

repeater(function() { 
    alert("stuff happens!"); 
}, 3, 2000); 

Tal vez este último es un poco más fácil de entender.

En la versión setTimeout() puede asegurarse de que la siguiente iteración solo ocurra después de que haya terminado de ejecutarse. Simplemente movería la línea func()sobre la línea setTimeout().

+0

+1 Me gusta más su solución basada en el cierre que la propiedad de mi objeto basada en la que se encuentra a continuación. Al menos los dos estábamos pensando en términos de reutilización: D –

3

Esta función anónima (no introduce nada nuevo global) hará lo que necesite. Todo lo que tiene que hacer es reemplazar yourFunction con su función.

(function(fn, interval, maxIterations) { 
    var iterations = 0, 
    id = setInterval(function() { 
     if (++iterations > maxIterations) 
      return clearInterval(id); 

     fn(); 
    }, interval); 
})(yourFunction, 60000, 3); 
3

Extender Tomalak función:

Si desea saber cuántos ciclos se dejó:

var repeater = function(func, times, interval) { 
    window.setTimeout(function(times) { 
    return function() { 
     if (--times > 0) window.setTimeout(arguments.callee, interval); 
     func(times); 
    } 
    }(times), interval); 
} 

y uso:

repeater(function(left){ 
    //... (do you stuff here) ... 
    if(left == 0) { 
     alert("I'm done"); 
    } 
}, 3, 60000); 
4

que puede hacer con setInterval

var count = 0; 

var interval = setInterval(yourFunction(), 1000); 

function yourFunction(){ 

    clearInterval(interval); 
    if(count < 3){ 

    count ++; 
    interval = setInterval(yourFunction(), 1000); 
    } 

// your code 


} 
+0

Por favor, edite su respuesta y formatee el código para que sea legible. – kleopatra

Cuestiones relacionadas