2013-03-05 8 views
6

Ho bisogno di lasciare che una funzione venga eseguita per un numero fisso di secondi, quindi terminare. Potrei usare jQuery o web worker, ma il mio tentativo di farlo direttamente è fallito.Interrompere l'esecuzione della funzione dopo un tempo fisso in javascript

Tks aiuto adesso funziona:

startT = new Date().getTime(); 
i = 1; 

while(true){ 
    now = new Date().getTime(); 
    if((now - startT) > 100) { 
     break; 
    } 

    i++; 
} 

alert(i); 

risposta

3

tuo metodo proposto non funziona perché JavaScript è (soprattutto) a thread singolo - il ciclo inizia in un loop infinito, in modo che il gestore setTimeout non viene mai invocata , quindi keepGoing non viene mai impostato, quindi il ciclo non può terminare.

Sarebbe più semplice determinare un tempo assoluto in cui la funzione deve terminare e ogni tanto (cioè non su ogni iterazione) controllare se il tempo corrente ha superato quel punto.

Scegli un numero di iterazioni che ti dia un ragionevole compromesso tra l'efficienza del test per il tempo trascorso e la quantità di "straordinari" che sei disposto a lasciare alla funzione.

1

Il conteggio inizia un ciclo infinito, il codice non raggiunge mai il setTimeout().

1

tre questioni:

  • tuo timeout è impostato al fuoco in un millisecondo
  • tuo setTimeout non sarà raggiunto perché count sarà mai finire
  • tuo alert dovrebbe essere chiamato dall'interno count dopo la while o dalla callback setTimeout.

affrontare tali questioni e il codice dovrebbe funzionare. Eppure, avrei potuto andare con l'impostazione di una data di fine in anticipo, e confrontando con quella data nel while.

0

non so qual è lo scopo, ma si dovrà interrompere

function count() { 
    while(keepGoing) { 
     i = i+1; 
    } 
} 

per un po 'per dare una possibilità per keepGoing a cambiare in qualche altro posto che corre nel frattempo. Inoltre è mai fare questo:

while(keepGoing) { 
    i = i+1; 
} 

Stai bloccando completamente il filo per tutto ... Si dovrà dividere il lavoro della tua funzione in piccoli pezzi e usare setTimeout o setInterval per eseguirlo in piccoli lotti, qualcosa di simile a quanto segue, mentre vicino a quello che si può desiderare:

var piece_n=0; 
var keepGoing = true; 
var interval_id = setInterval(function() { 
    if(keepGoing){ 
     //do_a_short_piece_of_work(piece_n); 
     piece_n++; 
    }else{ 
     clearInterval(interval_id); 
    } 
},500); //ticking every half second 

setTimeout(function() { keepGoing = false; }, 10000); //run for a small bit more than 10 to 10.5 seconds + do_a_short_piece_of_work() execution time 

Se avete bisogno di esattamente 10 secondi senza morire di fame il resto avrete bisogno di regolare in una serie di setTimeout e sarà necessario conoscere un po 'in anticipo (più del prossimo segno di spunta) in modo da poter impostare l'ultimo setTimeo ut al momento esatto (consultando la data corrente e la data iniziale salvata). Tutto può essere diviso in blocchi più piccoli, come le istruzioni per una CPU :)

Problemi correlati