2017-08-14 3 views
0

ich zu überprüfen, ich versuche, wenn eine Variable auf 1 mit Hilfe von Javascript gleich ...Warten Sie, bis Variable gleich

myvalue = 1; 
 

 
function check() { 
 
    if (myvalue == 1) { 
 
     return setTimeout(check, 1000); 
 
    } 
 

 
    alert("Value Is Set"); 
 
} 
 

 
check();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

ich auf das Hinzufügen einer Verzögerung der Einstellung der Variablen bin der Planung Aber warum funktioniert diese einfache Version nicht?

+0

Unklar, was Sie fordern? Sie rufen die gleiche Funktion auf und gehen jedes Mal in die 'if'-Schleife. Damit? –

+1

Sie wären besser dran, wenn Sie auf ein Ereignis mit variabler Änderung warten, wie in dieser Frage: [Auf Variablenänderungen in JavaScript oder jQuery warten] (https://stackoverflow.com/questions/1759987/listening-for-variable- changes-in-javascript-or-jquery) – Liam

+1

Sie zeigen hier keinen jQuery-Code oder irgendeinen Code, der jemals den Wert von 'myvalue' ändert. –

Antwort

1

Mit setTimeout(check, 1000); wird die Funktion nur einmal aufgerufen. Das ist nicht was du suchst.

Was Sie suchen, ist setInterval, die eine Funktion alle n Millisekunden ausführt.

Sehen Sie sich das folgende Beispiel an, das auf den Wert 1 wartet, indem es setInterval verwendet und dann die setInterval Instanz löscht, sobald dies der Fall ist.

4 Sekunden warten, wenn das Snippet unten ausgeführt wird:

// First - set the value to 0 
 
myvalue = 0; 
 

 
// This variable will hold the setInterval's instance, so we can clear it later on 
 
var interval; 
 

 
function check() { 
 
    if (myvalue == 1) { 
 
     alert("Value Is Set"); 
 

 
     // We don't need to interval the check function anymore, 
 
     // clearInterval will stop its periodical execution. 
 
     clearInterval(interval); 
 
    } 
 
} 
 

 
// Create an instance of the check function interval 
 
interval = setInterval(check, 1000); 
 

 
// Update the value to 1 after 4 seconds 
 
setTimeout(function() { myvalue = 1 }, 4000);

+0

Es gibt keine "Instanz der setTimeout-Funktion" zurück. Es gibt den Rückgabewert zurück. Der ursprüngliche Code sollte auch funktionieren, das Problem ist höchstwahrscheinlich, dass der Wert nie festgelegt wird. – Matthias247

+0

Es ist immer noch falsch. Beim ersten Timeout wird 'check' aufgerufen und der nächste' setTimeout' wird gestartet. Obwohl das Schlüsselwort "return" nicht benötigt wird, unterscheidet sich das Gesamtverhalten nicht von dem auf setInterval basierenden. – Matthias247

+0

Ok, ich hatte schlechte Augen. Der OP-Code hätte funktioniert, wenn der Check "if (myvalue! = 1)" gewesen wäre, was ich zuerst gesehen habe. Dann wäre eine synchrone setTimeout-Schleife eingetreten und hätte sich ähnlich wie Ihre setInterval-basierte Lösung verhalten. Ich wollte nur darauf hinweisen, dass setInterval nicht notwendig ist, und setTimeout kann das gleiche tun (wenn richtig verwendet). – Matthias247