2012-02-29 13 views
8

Esto probablemente sea solo un error de sintaxis de frustración de mi parte. Pero resizeTime simplemente no se borrará. El temporizador sigue funcionando independientemente de usar clearInterval en él más de una vez. ¿Alguna idea gente? He publicado mi código real:clearInterval no funciona

var resizeTime; // declared outside of wrapper function to INSURE no second declaration will occur 
    var myTransitionEvent = whichTransitionEvent(); 

    $(window).bind('adapt', function(){ 
     console.log('start', resizeTime); 
     resizeTime = setInterval(function(){ 
       console.log('go', resizeTime); 
       methods.relayoutChildren.apply(self); 
     }, 5); 
     setTimeout(function(){ 
     console.log('sNend', resizeTime); 
       clearInterval(resizeTime); 
     },1000); 

    }); 

    $('#allies-wrap').bind(myTransitionEvent, function(){ 
     console.log('end', resizeTime); 
     clearInterval(resizeTime); 
     methods.relayoutChildren.apply(self); 
    }); 

Aquí está un ejemplo de registro de cromo:

start undefined 
    start 8215 
    (10) go 8218 
    start 8218 
    start 8221 
    (256) go 8224 
    (2) sNend 8224 
    (9) go 8224 
    sNend 8224 
    (3) go 8224 
    sNend 8224 
    (2596) go 8224 

para aquellos que no conocen el diario de cromo, (2596) significa 2596 ocurrencias de un registro idéntico.

+0

¿hay algún error? –

+0

sin error, desde mi IDE o el navegador; excepto 'ir' miles de veces en el registro. – Fresheyeball

+0

¿Podemos tener un ejemplo más detallado de código que ejecutando el temporizador (el código en el enlace 'adaptado' está funcionando perfectamente comenzando y borrando el intervalo http://jsfiddle.net/vHn9r/) –

Respuesta

7

Creo que el evento de transición no se activa, pero el evento adapt se activa una y otra vez. Entonces resizeTime cambia antes de que el activo se borre. Puede solucionarlo (al menos hacerlo mejor) borrando el intervalo antes de configurar uno nuevo.

clearInterval(resizeTime); 
resizeTime = setInterval(function(){ 
        console.log('go', resizeTime); 
        methods.relayoutChildren.apply(self); 
      }, 5); 

clearTimeout(sNendTime); 
sNendTime = setTimeout(function(){ 
       console.log('sNend', resizeTime); 
       clearInterval(resizeTime); 
     },1000); 

EDIT:

Lo que pasa es

  1. adapt evento activa
  2. Un nuevo intervalo se establece y Identificación del intervalo asignado a resizeTime
  3. se establece un nuevo tiempo de espera
  4. Entonces ahora 2 cosas están activas: 1 intervalo, 1 tiempo de espera
  5. Antes de que el tiempo de retardo de espera transcurre, de nuevo adapt evento activa
  6. se establece un nuevo intervalo y Identificación del intervalo asignado a resizeTime
  7. Como resizeTime se sobreescribe el ID de intervalo anterior se pierde, pero ese intervalo todavía activo
  8. Un nuevo tiempo de espera se establece
  9. Así que ahora las cosas 4 - 2 activos intervalos de tiempos de espera, 2
  10. salga a la
  11. Después de 1000, dicen que hay 20 intervalos, tiempos de espera de 20 activos
  12. primera vez fuera invoca la función y se despeja el intervalo indicado por el valor 20 de resizeTime
  13. Así que todavía 19 intervalos y 19 tiempos de espera activos
  14. Continúa
  15. Incluso si transitionevent desencadena un viaje de solo borrar la última intervalo de

para su código para que funcione debe haber un transitionevent después de cada adapt evento, pero no lo hay. Así que tenemos que borrar el intervalo activo y el tiempo de espera activo para que solo haya uno de cada activo a la vez, y cuando finaliza el tiempo de espera, la función también borra el intervalo.

+0

Señor, usted es un erudito y un santo. Eso funcionó perfecto, pero todavía no entiendo por qué. La variable solo se declara una vez, entonces, ¿cómo puede la repetición de establecerse en un intervalo causar este problema? ¿No debería simplemente reiniciarse? ¿Puede una variable ser múltiples intervalos? – Fresheyeball

+0

:). No, no se restablece solo y apunta a solo uno a la vez. Ver el EDIT, lo he explicado. Gracias. – Diode

+0

ahora que es genial. Gracias por una respuesta excelente. ¡Acabo de aprender algo nuevo sobre js! – Fresheyeball