Da Javascript in einem Browser ein einzelner Thread ist (mit Ausnahme von Webworkern, die hier nicht beteiligt sind) und ein Thread der Javascript-Ausführung vollständig ausgeführt wird, bevor ein anderer ausgeführt werden kann, lautet Ihre Aussage:
while(flag==false) {}
wird einfach für immer ausgeführt (oder bis sich der Browser über eine nicht reagierende Javascript-Schleife beschwert), die Seite scheint hängen zu bleiben und kein anderes Javascript kann jemals ausgeführt werden, sodass der Wert des Flags niemals geändert werden kann.
Für ein wenig mehr Erklärung ist Javascript eine ereignisgesteuerte Sprache . Das bedeutet, dass ein Teil von Javascript ausgeführt wird, bis die Kontrolle an den Interpreter zurückgegeben wird. Erst wenn es zum Interpreter zurückkehrt, ruft Javascript das nächste Ereignis aus der Ereigniswarteschlange ab und führt es aus.
Alle Dinge wie Timer und Netzwerkereignisse werden in der Ereigniswarteschlange ausgeführt. Wenn also ein Timer ausgelöst wird oder eine Netzwerkanforderung eintrifft, "unterbricht" er niemals das aktuell ausgeführte Javascript. Stattdessen wird ein Ereignis in die Javascript-Ereigniswarteschlange gestellt. Wenn das aktuell ausgeführte Javascript beendet ist, wird das nächste Ereignis aus der Ereigniswarteschlange gezogen und kann ausgeführt werden.
Wenn Sie also eine Endlosschleife wie z. B. while(flag==false) {}
ausführen, wird das aktuell ausgeführte Javascript nie beendet, und daher wird das nächste Ereignis nie aus der Ereigniswarteschlange gezogen, und daher wird der Wert von flag
nie geändert. Der Schlüssel hier ist, dass Javascript nicht Interrupt-gesteuert ist . Wenn ein Timer ausgelöst wird, wird das aktuell ausgeführte Javascript nicht unterbrochen, es wird kein anderes Javascript ausgeführt und das aktuell ausgeführte Javascript wird fortgesetzt. Es wird nur in die Ereigniswarteschlange gestellt und wartet, bis das aktuell ausgeführte Javascript fertig ist, damit es an die Reihe kommt.
Was Sie tun müssen, ist zu überdenken, wie Ihr Code funktioniert, und einen anderen Weg zu finden, um den Code auszulösen, den Sie ausführen möchten, wenn der Codeflag
Wert ändert. Javascript ist als ereignisgesteuerte Sprache konzipiert. Sie müssen also herausfinden, an welchen Ereignissen Sie ein Interesse anmelden können, damit Sie entweder auf das Ereignis warten können, durch das sich das Flag möglicherweise ändert, und das Flag für dieses Ereignis untersuchen oder Ihr eigenes Ereignis auslösen können Unabhängig davon, welcher Code das Flag ändert oder Sie eine Rückruffunktion implementieren können, kann jeder Code, der dieses Flag ändert, Ihren Rückruf aufrufen, wenn der Code, der für die Änderung des Flag-Werts verantwortlich ist, seinen Wert in ändert. Er true
ruft lediglich die Rückruffunktion und damit Ihren Code auf das will laufen, wenn das Flag gesetzt wirdtrue
wird zur richtigen Zeit laufen. Dies ist viel, viel effizienter als der Versuch, den Flag-Wert ständig mit einem Timer zu überprüfen.
function codeThatMightChangeFlag(callback) {
// do a bunch of stuff
if (condition happens to change flag value) {
// call the callback to notify other code
callback();
}
}
jQuery.Deferred
,Q
,async
, ...