[JS] OOP - Rekursiver aufruf mit "setTimeout"?

08/31/2013 22:17 Masterakio1995#1
Hallo liebe Community,
ich bräuchte eine Möglichkeit, damit sich die Methode eines Objekts rekursiv aufrufen kann.

Bisher habe ich es so versucht:
Code:
setTimeout("this.move('down', 0)", 5);
oder (player ist die Klasse):

Code:
setTimeout("player.move('down', 0)", 5);
funktionieren tut es so (player1 ist das Objekt):

Code:
setTimeout("player1.move('down', 0)", 5);
allerdings will ich es relativ Adressieren und nicht absolut, da ich nicht nur 1 Spieler / Objekt habe. Hat wer eine Idee wie ich das machen kann?
08/31/2013 22:21 Synatex#2
Nunja, sich ne Variable bauen die das ganze steuert.

PHP Code:
var keepMoving true;

var 
move = function() {
   if(
keepMoving) {
       
move();
   }
}; 
08/31/2013 22:29 Masterakio1995#3
Quote:
Originally Posted by Synatex View Post
Nunja, sich ne Variable bauen die das ganze steuert.

PHP Code:
var keepMoving true;

var 
move = function() {
   if(
keepMoving) {
       
move();
   }
}; 
Normalerweise wäre das eine Möglichkeit, allerdings glaube ich das dadurch keine flüssige Animation ensteht bzw sie zu schnell ausgeführt wird. Und mit einem Sleep Befehl würde sich ein anderer Teil des Skriptes verzögern was ich vermeiden möchte.
08/31/2013 23:16 Synatex#4
PHP Code:
var keepMoving true

var 
move = function() { 
   if(
keepMoving) {
       
// Verzögerung um 0,5 Sekunden
       
setTimeout(function() {
           
move();
       }, 
500);
   } 
}; 
Ist ja wohl nicht wirklich schwer die da reinzubauen^^
08/31/2013 23:19 Tasiro#5
"Sleep" gibt es in Javascript nicht. Du kannst nur asynchron programmieren.

Ja, das würde zu schnell ausgeführt - es führte (in der ersten Form) zu einem Stapelüberlauf, da es in Javascript kein gleichzeitiges Ausführen gibt: alle Funktionen und Rückrufe werden schön nacheinander ausgeführt.

Möglich ist es aber so (mit setInterval):
Es könnte auch setTimeout statt setInterval verwendet werden, dann müsste entsprechend in move erneut setTimeout aufgerufen werden, wie Synatex schrieb.
09/01/2013 00:22 マルコ#6
Ein sleep zu programmieren ist aber wirklich nicht schwer.
Einfach aktuelle Zeit in ne Variable und in ner while Schleife gegen die aktuelle Zeit testen, bis die aktuelle Zeit größer oder gleich der gespeicherten Zeit plus der time2wait ist.
Aber nur, falls dir der sequentielle Ansatz lieber ist.
09/01/2013 00:42 Tasiro#7
Wem es Spaß macht, die Oberfläche einzufrieren, kann das gerne tun (sofern es im Kontext einer Seite ausgeführt wird, wie es normalerweise der Fall ist). In Javascript gibt es kaum eine synchrone Operation, nur new XMLHttpRequest ().open ("GET", url, false), alert und ein paar andere Funktionen (welche aus genau diesem Grund nicht genutzt werden sollten), sowie eine synchrone API für IndexedDB und FileSystem - aber diese beiden nur in einem WorkerGlobalScope (Thread oder Prozess). Für WebSockets etwa gibt es keine synchrone API (auch in einem WorkerGlobalScope), weil es dabei durchaus mehrere Sekunden bis zu einer Antwort brauchen kann, im Gegensatz zu einigen Millisekunden.
09/01/2013 03:35 マルコ#8
wenn er nur eine Verzögerung im Millisekundenbereich braucht, dann wäre diese Lösung durchaus nutzbar. Bzw. es kommt auch darauf an, wie der Rest programmiert ist...
Ich selbst habe noch nie einen solchen Sleep benötigt, kenn also die genauen Auswirkungen nicht.
09/01/2013 09:40 Masterakio1995#9
Habe in einem anderen Forum die Lösung erhalten. Funktioniert indem ich eine Referenz angebe.
09/01/2013 12:34 MrPuschel#10
Du solltest ebenfalls die Lösung posten.