[AJAX] Fehler mit return var

totalNooob

Grünschnabel
hallo forum,

ich bin ajax anfänger und weis einfach nicht mehr weiter. ich habe folgendes problem:
die javascript funktion nicknameValidation() ruft die datei test2.php auf und bekommt 0 oder 1 zurück.

bedingung wenn NULL, dann soll die variable "checkVar" auf 11 gesetzt werden andernfalls auf 22 und anschließend "checkVar" mit return zurückgeben.
eigentlich ganz einfach aber ich finde den fehler einfach nicht, zumal es mal funktioniert hat. der übersichtlichkeit und fürs bugfinding habe ich alles unwesendliche schon zuvor rausgefiltert. mein code sieht folgendermaßen aus:

Code:
<html>
	<head>
		<title>test</title>
		<script type="text/javascript">
			function nicknameValidation(){
					var checkVar = 0;
					
							  	var req = null;
				
				                try{
				                    req = new XMLHttpRequest();
				                }
				                catch (ms){
				                    try{
				                        req = new ActiveXObject("Msxml2.XMLHTTP");
				                    } 
				                    catch (nonms){
				                        try{
				                            req = new ActiveXObject("Microsoft.XMLHTTP");
				                        } 
				                        catch (failed){
				                            req = null;
				                        }
				                    }  
				                }
				
				                if (req == null)
				                      alert("Error creating request object!");
				 
				                  	req.open("GET", "test2.php?test=1", true);
				                
				
				                req.onreadystatechange = function(){ 
				                
				                	
				                    switch(req.readyState) {
				                            case 4:
				                            if(req.status!=200) {
				                                alert("Fehler:"+req.status); 
				                            }else{    

				                                var nick = req.responseText;
												
												
												
				                                if(nick==true){
				                                	
				                                	checkVar=11;
				                                	         
													
				                                }else {
				                                	

				                                	checkVar=22;

				                                }
				                                
				                             /* alert(checkVar); hier ausgabe test*/
				                             /* return checkVar;*/
												
				                               
				                            }
				                            break;
				                    
				                            default:
				                              /* alert("fehler default"); */
				                              
				                            break;     
				                        }
				                    };
				  
				                  req.setRequestHeader("Content-Type",
				                                      "application/x-www-form-urlencoded");
				                req.send(null); 
						
					/* return checkVar;*/
					return checkVar;
				}
		</script>
	</head>
	<body>
		<script language="javascript">
			
			var nick = nicknameValidation();
			alert(nick);
			
			/* hier sollte eigentlich nick = 11 oder 22 sein, 
			stattdessen ist checkVar immer NULL und wenn ich 
			var checkVar = 0; ganz am anfang der funktion rausnehme, 
			dann ist checkVar "undefined" 
			
			wenn ich mir checkVar per alert ausgeben lasse ( stelle:ausgabe test), 
			dann ist checkVar richtig gesetzt. nämlich 11 oder 22
			*/
			
			
		</script>
	</body>
</html>

Vielen Dank schonmal im vorraus
mfg
 
Moin,

du kannst den Rückgabewert von nicknameValidation() nicht direkt verarbeiten.

Ursache: dein HTTPRequest erfolgt asynchron, was bedeutet, dass Skripte weiter abgearbeitet werden, während der Request noch nicht abgeschlossen ist.
Die Funktion wird also beendet(und gibt den voreingestellten Wert zurück, falls vorhanden)....ohne dass die Antwort vom Server bereits erfolgt ist.

Wenn du später im alert() den korrekten Wert bekommst, dürfte der Request abgeschlossen sein.

Lösung: das, was du mit der Antwort vom Server machen willst, müsstest du in der req.onreadystatechange-Funktion erledigen, dort hast du beim readyState 4 die Serverantwort verfügbar.

Alternativ könntest du zwar den Request synchron starten (indem du den 2.Parameter von req.open auf false setzt) ...das wäre aber nicht unbedingt empfehlenswert, weil das den Browser unbenutzbar macht, bis die Antwort vom Server erhalten wurde.
 
Hi,

und beachte in deinen zukünftigen Beiträgen bitte die Netiquette (Nr.15) bzgl. deiner durchgängigen Kleinschreibung, die in unserem Forum nicht erwünscht ist, und der du mit deiner Registrierung zugestimmt hast - vielen Dank! :)

mfg Maik
 
Hallo Sven,
vielen Dank für deine Antwort.
Leider habe ich deine Lösung noch nicht ganz verstanden.

So wie es aussieht, wird die Serverantwort doch bereits in der Funktion req.onreadystatechange ausgeführt.
Und mit CASE 4: auf readyState gewartet. Kannst du mir ein kleines Beispiel dazu geben?

Vielen Dank nochmals
mfg
 
So wie es aussieht, wird die Serverantwort doch bereits in der Funktion req.onreadystatechange ausgeführt.
Und mit CASE 4: auf readyState gewartet. Kannst du mir ein kleines Beispiel dazu geben?

Sie wird nicht "bereits" ausgeführt, sondern erst.

Dass du die Überwachung des onreadystatechange-Events innerhalb der Funktion nicknameValidation() initialisierst, bedeutet nicht, dass der Eintritt des onreadystatechange-Events in irgendeiner Beziehung zur Funktion nicknameValidation() steht.
Dieser Event feuert irgendwann...und wann, das bestimmt alleinig der Server.
 
Hallo Sven,
kannst du mir ein Beispiel geben wie ich die Beziehung zwischen nicknameValidation() und dem onreadystatechange-Events aufbaue und abfrage wann der Server antwortet?
Wie gesagt es hatte bei mir so schon mal funktioniert und ich in der zwischenzeit habe ich nichts verändert. Es sei denn ich "schlafwandel" Nachts :) (bin mir nicht mehr ganz sicher^^)

nochmals vielen Dank das Du dir die Zeit genommen hast.
lg
 
Sofern du den Request nicht synchron vornimmst(was auch wie erwähnt nicht empfehlenswert wäre), kannst du da keine Beziehung aufbauen.

Hier hast du das gewünschte Ergebnis verfügbar:
Code:
/* alert(checkVar); hier ausgabe test*/
...an dieser Stelle kannst du tun, was du damit tun möchtest....vorher nicht.
 

Neue Beiträge

Zurück