2012-02-29 12 views
8

Questo probabilmente è solo un errore di sintassi di frustrazione da parte mia. Ma resizeTime non sarà chiaro. Il timer continua a funzionare indipendentemente dall'utilizzo di clearInterval su di esso più di una volta. Qualche idea gente? Ho inviato il mio codice reale:clearInterval non funziona

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); 
    }); 

Ecco un registro di esempio da Chrome:

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 

per coloro che non sanno di log di Chrome, (2596) significa 2596 occorrenze di un registro identico.

+0

hai qualche errore? –

+0

nessun errore, dal mio IDE o dal browser; tranne "vai" migliaia di volte nel registro. – Fresheyeball

+0

Possiamo avere un esempio più dettagliato di codice che esegue il timer (il codice nel binding 'adapt' funziona perfettamente iniziando e cancellando l'intervallo http://jsfiddle.net/vHn9r/) –

risposta

7

Penso che l'evento di transizione non venga attivato ma l'evento adapt viene attivato ancora e ancora. Quindi le modifiche resizeTime prima che venga cancellata quella attiva. Puoi aggiustarlo (almeno renderlo migliore) cancellando l'intervallo prima di impostarne uno nuovo.

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:

Quello che succede è

  1. adapt evento attiva
  2. Un nuovo intervallo è impostato e l'intervallo ID assegnato al resizeTime
  3. Un nuovo timeout è impostato
  4. Quindi ora sono attive 2 cose: 1 intervallo, 1 timeout
  5. Prima il time out di ritardo è trascorso, ancora una volta adapt evento attiva
  6. Un nuovo intervallo è impostato e l'intervallo ID assegnato al resizeTime
  7. Come resizeTime viene sovrascritto l'id al precedente intervallo è perduto, ma quell'intervallo ancora attivo
  8. Un nuovo timeout è impostato
  9. Così ora 4 cose attivi - intervalli di 2, 2 timeout
  10. si va avanti
  11. Dopo 1000, dicono che ci sono intervalli di 20, 20 timeout attivi
  12. Prima volta fuori invoca la funzione e si cancella l'intervallo indicato dalla 20th valore resizeTime
  13. Quindi ancora 19 intervalli e 19 timeout attivi
  14. Si va avanti
  15. Anche se transitionevent innesca sarà solo cancellare l'ultima intervallo

per il codice per lavorare ci dovrebbe essere un transitionevent dopo ogni adapt evento, ma non c'è. Quindi dobbiamo cancellare l'intervallo attivo e il timeout attivo in modo che ci sia solo uno di ciascuno attivo alla volta, e quando il timeout termina la funzione azzera anche l'intervallo.

+0

Signore, tu sei uno studioso e un santo. Funzionava perfettamente, ma non capisco ancora perché. La variabile viene dichiarata una sola volta, quindi come può la ripetizione di essere impostata su un intervallo causa questo problema? Non dovrebbe semplicemente resettarsi? Una variabile può avere più intervalli? – Fresheyeball

+0

:). No, non si resetta e punta a uno solo alla volta. Vedi l'EDIT, l'ho spiegato. Grazie. – Diode

+0

ora è bello. Grazie per un'ottima risposta, ho appena imparato qualcosa di nuovo su js! – Fresheyeball