JavaScript jQuery $.ajax success: Variablenwert festlegen

raffiSSL

Lt. Junior Grade
Registriert
Feb. 2006
Beiträge
289
Hallo,
ich habe da ein kleines Problem mit folgendem Quelltext-Schnipsel:
Code:
function validate () {
			var $name = $('#bezeichnung_rde_server').val();
			var $value_exists = null;
			if ($name == "") {
				return false;
			}
			$.ajax ({
				type: 'get',
				url: '/drupal/sites/all/modules/custom/add_rde_server/existingValue.php?name='+$name,
				dataType: 'json',
				success: function ($reqCode) {
					if ($reqCode.msg == 'failed') {
						$value_exists = false;
						// alert($value_exists);
					}
					else if ($reqCode.msg == 'success') {
						$value_exists = true;
						// alert($value_exists);
					}
				}
			});
			alert($value_exists);
			return $value_exists;
}

Leider wird der Wert $value_exists im Teil success vom ajax-Aufruf nie geändert, obwohl ich nach Testausgaben festgestellt habe, dass der success-Block ordentlich durchlaufen wird. Ohne die Definition der Variable ganz oben, schimpft firebug, dass die Variable nicht definiert sei. Sobald ich das dann eben mache, bleibt der Wert, welchen ich oben zuweise unverändert erhalten. Warum?

Vielen Dank.
 
Hi,

wenn du das "alert($value_exists);" im "success" Teil einkommentierst, was gibt er dir da aus?

Aus dem "var $value_exists = null;" oben mach doch bitte mal was anderes, nur zu Testzwecken.

VG,
Mad
 
Dein ajax-Aufruf ist asynchron, das heißt, die validate-Funktion wartet nicht darauf, dass er fertig wird, sondern macht sofort bei alert() weiter - bevor überhaupt success() aufgerufen worden ist. Der einfachste Weg, das zu ändern, ist, "async: false" zu den ajax-Optionen hinzuzufügen.
 
Also beim Auskommentieren im success-Block zeigt er im erscheinenden Popup immer den richtigen Wert an, landet also im richtigen Teil der if-Abfrage und setzt auch $value_exists korrekt.
Ich habe des Weiteren oben die Variable mal mit new Boolean() initialisiert, allerdings setzt er diese auf false, und gibt damit immer false zurück.
Ich hatte oben schon testweise mit false respektive true initialisiert, aber dann bleibt der Wert genau so und ändert sich nicht.

MfG

EDIT:
@NullPointer
Die Alerts habe ich generell nur zu Prüfungszwecken da rein geschrieben. Insgesamt besteht das Dokument aus noch mehr Code. Das Gesamtergebnis ist leider trotzdem falsch, auch mit dem Setzen von async: 'false' und ohne alerts.
Trotzdem danke
 
Zuletzt bearbeitet:
Also das klappt nicht, wenn du es so machst, ohne den Boolean vorher zu deklarieren?
Code:
if ($reqCode.msg == 'failed') {
var exists= false;
return(exists)
}
else if ($reqCode.msg == 'success') {
var exists= true;
return(exists)
}
Wäre meiner Ansicht nach am einfachsten.
 
Zuletzt bearbeitet:
Hi,

genau das wollte ich dir damit klar machen: Der Wert wird sehr wohl geändert...allerdings nicht in der Reihenfolge, die du vorgesehen hast :)

Einfachster Workaround:
- definiere eine Variable "wait" die den Wert "true" hat
- dieses "wait" setzt du im "failed" und "success"-Fall auf "false"
- unten eine Schleife / Interval, die solange nichts macht bis "wait = false" ist. Dann ist der Wert "$value_exists" auch richtig gesetzt

VG,
Mad
 

Beachte die Schreibweise: 'false' ist nicht gleich false. Wenn du den String 'false' als Boolean interpretierst, kommt true heraus. Versuch's mal ohne Hochkommas.
 
NullPointer schrieb:
Beachte die Schreibweise: 'false' ist nicht gleich false. Wenn du den String 'false' als Boolean interpretierst, kommt true heraus. Versuch's mal ohne Hochkommas.

Ah ok. Das war die Lösung.
Jetzt funktioniert es so wie es soll.

Danke nochmals, ging ja richtig flott hier. :)

@G00fy
Das return direkt im success-Block hatte ich auch schon versucht, führte aber auch nicht zum geünschten Ergebnis (weis allerdings jetzt nicht mehr warum).
 
Auch wenns hier mal zielführend ist: AJAX auf async:false führt irgendwie das erste A in AJAX ad absurdum...
 
Zurück
Oben