Hi leute,
wisst ihr obs in Javascript ne möglichkeit gibt, ne bestimmte zeit (oder auch für eeeewig ;)) zu warten, bis eine Variable einen bestimmten Wert (bei mir brauchts blos true) hat? Wär supercool wenn da jemand was wüsste, danke schonaml im vorraus an alle die sich gedanken machen.
JS - Warten bis eine Variable true ist
-
-
mal so als doofe idee, ne funktion schreiben die ne globale variable initialisiert und diese methode rufste im timeout auf, denn du in der funktion wieder deaktivierst
pseudocode:
-
Coole idee, klappt aber leider nicht, weil das Hauptscript dann ja weiterläuft, aber das darfs nicht. Wenn man nen alert(); aufruft, wartet das script ja auch, bis was aufm alert geklickt wurde.
-
mmh was hälste denn davon des hauptscript in zwei funktionen auszulagern?
dann lässte die eine laufen, dann des mit dem timeout und dann die andere.
is nen arsch voll arbeit und du brauchst viele viele globale vars, aber könnte klappenansonsten sind spkulationen schwer ohne zu wissen worum es ght und was du machen willst..
und von threads in javascript hab ich auch noch net gehört... -
Allein bei dem Gedanken an eine "Endlosschliefe" wird mir übel. Wofür braucht man so einen Quatsch???
-
naja senior-devis haben mir auch mal gesagt, dass es für sowas anwendungsfälle geben würde.. mir erschliesst sich der sinn auch net so ganz..
-
Allein bei dem Gedanken an eine "Endlosschliefe" wird mir übel. Wofür braucht man so einen Quatsch???
Im Web-Bereich kann ich zustimmen, aber es gibt ja noch andere *g*. Jedes Programm in AutoIT z.B. muss in eine Endlosschleife gepackt werden
Hab jetzt versucht mir was auszudenken, komm aber auf keinen Fall, bei dem ich es brauchen würde (in JS). Wird wohl wirklich ein Dino-fall sein.Tobse, anders geht es nun mal nicht. Du kannst dir deine kleine "Pause" Funktion schreiben, dann musst du aber dementsprechend noch die Bedingungen in dein Hauptscript einbauen. Da wir immer noch nicht wissen, worum es geht, kann ich schlecht sagen ob sich der Aufwand lohnt.
Wenn das Hauptscript garnicht erst gestartet werden soll bis die Bedingung erfüllt wird, wäre aufjedenfall schnell realisiert. Mittendrin kann es oft kompliziert werden, je nach deiner Scriptlänge eben. -
Des problem ist halt, dass das Hauptscript eien Wert zurückgeben soll, aber da das von einer Variable abhängt, die etwas bruach, um bereit zu sein, muss das script warten.
-
tobse, tu uns und dir nen gefallen und spuck aus worum es genau geht, das rumgefrickel und hyopthesenproggen is fürn hintern
-
Ich wollte mir ein AJAX-Tool bauen. Das hätte dann so ausgesehen:
Und das geht dann so:
ajax.call(); Baut über ein verbindungs-Objekt die Verbindung zum Server auf und ruft den request ab. Dann kann man ja über request.onreadystatechange eine funktiondefinieren. In de seteht dannCodefnction readystatechange() { if (request.readyState==4) { if (request.anderStatus==200) { // Ich hab den code nciht hier ajax.saved=request.responseXML; ajax.fetched=true; } }
Und daran liegts. Wenn man jetzt mit ajax.get(); die sachen haben will, BEVOR sie durch readystatechange(); verfügbar sind, klappts nicht. Also soll ajax.call(); aufgehalten werden, bis ajax.fetched true ist, damit das Hauptscript ajax.get(); erst dann ausführt, wenn die Daten auch da sind. Und ein weiteres Problem, dass auchnoch aufgetreten ist, ist, dass readystatechange() nichtmal aufgerufen wird.
-
ja dann bau doch unter des
ajax.fetched=true;ne initialisierung von deiner variable
und für danach die methode mit dem call aus wo du des aber auch vom true deiner variablen abhängig machst -
Ich verstehs nich so ganz, sorry. Wie meinst du das
Zitat
und für danach die methode mit dem call aus wo du des aber auch vom true deiner variablen abhängig machst -
-
Ne, dass gibt ne Endlosschleife. In ajax.call(); wird ja readystatechange(); dazu benützt, die Daten bereitzustellen. Und ajax.get(); soll warten, bis readystatechange(); das getan hat.
EDIT:
Ich habe jetzt von Bekannten erfahren, dass es in UNIX-Scripten die funktion wait(); gibt, worauf ich "javascript wait" gegoogelt hab. Ich bin dann auf folgendes gestoßen:Codefunction pausecomp(millis) { var date = new Date(); var curDate = null; do { curDate = new Date(); } while(curDate-date < millis); }
und hab das so umgeformt:
Codefunction waituntil(param, millis) { var date = new Date(); var curDate = null; var i=0; while (!param && i<4) { do { curDate = new Date(); } while(curDate-date < millis); i++; } }
Damit müsste es funktionieren:
Code
Alles anzeigenajax.get=function(tagname, number) { waituntil(ajax.fetched, 300); if(!number) { number=null; } if (number!=null) { return ajax.saved.getElementsByTagName(tagname)[number]; } else { return ajax.saved.getElementsByTagName(tagname); } }
Bleibt aber immernoch das Problem, dass readystatechange(); nicht aufgerufen wird.
-
tobse ich bin derzeit übefragt, daich mein ajax-buch zeitmässig abbrechen musste um was anderes zu lesen/machen
aber grundsätzlich bekommste ja bei nemeinlesen doch automatisch nen readystate und nen returncode zurück und erst wenn des eintritt macht man ja weiter... -
Jo, so isses. ich bin jez auch wieder daheim und hab den code, ich poste jetzt mal alles was relewant ist. Das müsste, so wies is auch funktionieren, wenn denn (jetz hier:) fetchdata(); aufgerufen würde. Auch wenn ich die hallole(); umbenenn, klappts net. Ich bin hilflos
Code
Alles anzeigenajax_saved=null; ajax_fetchable=null; function last() {} // Steh korrekt/komplett im code function init_ajax() {} // Steh korrekt/komplett im code function waituntil()} // Steh korrekt/komplett im code request=init_ajax(); function fetchdata() { alert(' '); if (request.readyState == 4) { if (request.status == 200) { ajax_saved=request.responseXML; ajax_fetchable=true; } } } ajax_call=function(resource, method, send) { ajax_fetchable=false; if (!last(resource, "://")) { one=location.href.substring(0, last(location.href, "/")); resource=one+"/"+resource; } alert (resource); if (!method) { var method="GET"; } if (!send) { var send=null; } if (request) { request.open(method, resource, true); if (method=="POST") { var i=0; while (i<=send.length) { request.send(send[i]); } } request.onreadystatechange=fetchdata; return true; } else { ajax_saved=null; return false; } } ajax_get=function(tagname, number) { waituntil(ajax_fetchable, 300); var returns=null; if(!number) { number=null; } if (number!=null) { returns=ajax_saved.getElementsByTagName(tagname)[number]; } else { returns=ajax_saved.getElementsByTagName(tagname); } return returns; }