2011-10-07 10 views
18

Ho sviluppato un piccolo software di presentazione costituito da diapositive e risorse per ogni diapositiva. Quando una diapositiva viene sottoposta a rendering, tutte le sue risorse vengono sottoposte a looping e rendering dopo un ritardo utilizzando il metodo setTimeout. sembra dolce ...Forza setTimeout per attivare il payload prima dell'impostazione originale

Yaaay !, i requisiti sono cambiati, la presentazione è ora necessaria per agire come una presentazione di PowerPoint, l'evento clic del mouse farà sì che il prossimo asset da rendere alla pagina immediatamente.

La mia domanda è; c'è un modo per far scattare immediatamente il mio timeout? Posso ottenere e memorizzare in una pila il timeoutid che viene restituito quando viene creato il timeout. L'unica altra opzione sarebbe quella di cancellare il timeout e quindi ricreare l'elemento, che è molto più elaborato di quello che voglio fare, e non ho voglia di rifare il mio codice troppo.

Qualche idea?

risposta

14

La risposta breve è No. Non è possibile fare ciò che si sta chiedendo, a meno che non si tenga un elenco dei metodi da licenziare. Potresti quindi annullare il timer e attivare il metodo corrispondente.

19

Se si imposta il timer in questo modo:

var timer1 = window.setTimeout(mainFunction,500) 

chiamata immediatamente in questo modo:

window.clearTimeout(timer1) 
mainFunction() 

La chiave è quello di separare la funzione dal timer.

+1

poo, ho pensato che avrei dovuto fare questo, speravo in una soluzione rapida. Dato che la 'mainFunction' ha argomenti calcolati quando il timeout è impostato per la prima volta, dovrò fare un Refactoring per ottenerli nell'evento onlick ... grazie mille – lgados

+0

Vedere la mia risposta qui sotto per un wrapping di chiusura che evita di dover gestire più cose . Sostituisce il timeoutId con un oggetto con un metodo .cancel() e .trigger(). – Killroy

16

Si poteva avvolgerlo in una chiusura come questo:

function createTimeout(timeoutHandler, delay) { 
    var timeoutId; 
    timeoutId = setTimeout(timeoutHandler, delay); 
    return { 
     clear: function() { 
      clearTimeout(timeoutId); 
     }, 
     trigger: function() { 
      clearTimeout(timeoutId); 
      return timeoutHandler(); 
     } 
    }; 
} 

var a = new Date(); 

var timeout = createTimeout(function() { console.log(a); }, 1000); 
// timeout.clear(); 
timeout.trigger(); 
+1

soluzione elegante – JobaDiniz

Problemi correlati