2013-03-05 3 views

Antwort

3

Ihre vorgeschlagene Methode nicht funktioniert, weil Javascript ist (meist) Single-Threaded - die Schleife in einer Endlos-Schleife beginnt, so dass die setTimeout Handler wird nie aufgerufen , so keepGoing wird nie eingestellt, so dass die Schleife nicht abgeschlossen werden kann.

Es wäre am einfachsten, eine absolute Zeit zu bestimmen, zu der die Funktion beendet werden soll, und es wird so oft (d. H. Nicht bei jeder Iteration) überprüft, ob die aktuelle Zeit diesen Punkt überschritten hat.

Wählen Sie eine Anzahl von Iterationen, die Ihnen einen vernünftigen Kompromiss zwischen der Effizienz des Tests für die verstrichene Zeit und der Menge an "Überstunden", die Sie bereit sind, um die Funktion zu haben, geben.

1

Count beginnt eine Endlosschleife, Ihr Code erreicht nie die setTimeout().

1

Drei Fragen:

  • Ihr Timeout eingestellt ist in einer Millisekunde feuern
  • Ihre setTimeout nicht erreicht werden, da count nie
  • Ihre beenden alert sollte aus count nach den while aufgerufen werden oder von innerhalb des setTimeout Rückrufs.

Adresse diese Probleme und Ihr Code sollte funktionieren. Trotzdem hätte ich vielleicht ein Enddatum vorn setzen und mit diesem Datum in der while vergleichen können.

0

Ich weiß nicht, was der Zweck ist, aber Sie würden

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

für eine Weile zu unterbrechen, haben eine Chance zu geben für keepGoing an einem anderen Ort zu ändern, die inzwischen läuft. Auch Sie nie tun:

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

Sie sind völlig den Faden für alles blockiert ... Sie müssen Ihre Funktion die Arbeit in kleine Stücke teilen und setTimeout oder setInterval verwenden Sie es in kleinen Chargen zu laufen, so etwas wie die folgenden, während in der Nähe, was Sie wollen können:

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 

Wenn Sie genau den Rest 10 Sekunden benötigen, ohne hungern müssen Sie in einer Reihe von setTimeout anzupassen, und Sie werden ein wenig im Voraus wissen müssen (mehr als das nächste Häkchen), damit Sie das letzte setTimeo einstellen können ut zum genauen Zeitpunkt (aktuelles Datum und gespeichertes Anfangsdatum). Alles kann in kleinere Stücke unterteilt werden, wie Anweisungen für eine CPU :)

Verwandte Themen