2009-06-15 33 views
12

mi problema es que no puedo detener un temporizador.stop settimeout en la función recursiva

Tuve this method para establecer un tiempo de espera de este foro. Se supone que debe almacenar el identificador en la variable global. Por accidente, descubrí que todavía se está ejecutando después de esconder "mydiv".

También necesito saber ahora, si la función recursiva crea varias instancias o solo una para los tiempos de espera. Porque primero pensé que sobrescribe "var mytimer" cada vez. Ahora no estoy tan seguro.

¿Cuál sería una forma sólida de detener el temporizador?

var updatetimer= function() { 
//do stuff 
     setTimeout(function(){updatetimer();}, 10000); 

}//end function 


//this should start and stop the timer 
$("#mybutton").click(function(e) { 
     e.preventDefault(); 
     if($('#mydiv').is(':visible')){ 
        $('#mydiv').fadeOut('normal'); 
      clearTimeout(updatetimer); 

     }else{ 
        $('#mydiv').fadeIn('normal'); 
        updatetimer(); 
       } 
}); 

gracias, Richard

Respuesta

7

creo que usted no entiende 'setTimeout' y 'clearTimeout'.

Si desea establecer un temporizador que desea cancelar después, hacer algo como:

foo = setTimeout(function, time); 

luego llamar a

clearTimeout(foo); 

si desea cancelar ese temporizador.

Espero que esto ayude!

+0

yo diría que era bastante malo - es funcional, pero no hay forma de cancelarlo (porque el valor de setTimeout no se captura), pero eso es fácil de arreglar y trivial en comparación con hacer una solicitud cada segundo. Eso es realmente excesivo, ¿eh? – annakata

+0

gracias, ahora ya no entiendo mi propio código. ¿Cuál es la ventaja de usar esas funciones anónimas de todos modos? Vea el enlace –

+0

que es una pregunta completamente diferente porque la respuesta es bastante amplia :) – annakata

2

Como mytimer escrito es una función que nunca tiene el valor de un identificador de tiempo de espera, por lo tanto su declaración clearTimeout no logrará nada.

no veo ninguna recursividad aquí en absoluto, pero es necesario para almacenar el valor setTimeout vuelve, y si es necesario vincular esto con múltiples eventos potenciales que necesita para almacenar en contra de un valor clave que puede búsqueda - algo así como un elemento id tal vez?

+0

Entiendo lo que dices. –

0

Como se señaló anteriormente, la razón principal por la que este código no funciona es que eres passingt que algo incorrecto en la llamada clearTimeout - que necesita para almacenar el valor de retorno de la llamada que hace que setTimeout en updateFunction y pasar este en clearTimeout, en lugar de la función de referencia en sí.

Como segunda sugerencia de mejora: siempre que tenga lo que usted llama una función de tiempo de espera recursiva, sería mejor utilizar el método setInterval, que ejecuta una función a intervalos regulares hasta que se cancele. Esto logrará lo mismo que intenta hacer con su método updateFunction, pero es más limpio ya que solo necesita incluir la lógica "do stuff" en la función diferida, y probablemente sea más eficiente ya que no creará anidados cierres Además, es la forma correcta de hacerlo, lo que debe contar para algo, ¿verdad? :-)

+0

De la discusión en http://stackoverflow.com/questions/729921/settimeout-or-setinterval, setInterval no siempre es mejor. – billyswong

+0

sí, solo de esa discusión, se tiene la idea de que tiende a utilizar el tiempo de espera como el método preferido. porque setinterval se activa, por ejemplo. No sé sobre cierres anidados. Quizás tengas razón sobre eso. –

20

Creo que la mayoría de la gente está entendiendo por qué esto no funciona, pero pensé que le proporcionaría el código actualizado. Es prácticamente lo mismo que el tuyo, excepto que asigna el tiempo de espera a una variable para que se pueda borrar.

Además, la función anónima en un setTimeout es grande, si desea ejecutar la lógica en línea, cambiar el valor de 'esto' dentro de la función, o pasar parámetros en una función.Si solo desea llamar a una función, es suficiente pasar el nombre de la función como primer parámetro.

var timer = null; 

var updatetimer = function() { 
    //do stuff 

    // By the way, can just pass in the function name instead of an anonymous 
    // function unless if you want to pass parameters or change the value of 'this' 
    timer = setTimeout(updatetimer, 10000); 
}; 

//this should start and stop the timer 
$("#mybutton").click(function(e) { 
    e.preventDefault(); 
    if($('#mydiv').is(':visible')){ 
     $('#mydiv').fadeOut('normal'); 
     clearTimeout(timer); // Since the timeout is assigned to a variable, we can successfully clear it now 

    } else{ 
     $('#mydiv').fadeIn('normal'); 
     updatetimer(); 
    } 
}); 
0

(function() {

$('#my_div').css('background-color', 'red'); 
$('#my_div').hover(function(){ 
var id=setTimeout(function() { 
    $('#my_div').css('background-color', 'green'); 
}, 2000); 

var id=setTimeout(function() { 
    $('#my_div').css('background-color', 'blue'); 
}, 4000); 
var id=setTimeout(function() { 
    $('#my_div').css('background-color', 'pink'); 
}, 6000); 

    }) 

$("#my_div").click(function(){ 
     clearTimeout(id); 

     }) 

})();

+1

¿Puedes [editar] y explicar cómo responde esto a la pregunta? – yhw42

0

No se puede detener todas las funciones que se crean, intead de que convertir la función setInterval (representar la misma lógica que su función recursiva) y detenerlo:

// recursive 
var timer= function() { 
// do stuff 
    setTimeout(function(){timer();}, 10000); 
} 

La misma lógica utilizando setInterval:

// same logic executing stuff in 10 seconds loop 
var timer = setInterval(function(){// do stuff}, 10000) 

detenerlo:

clearInterval(timer); 
Cuestiones relacionadas