Funktion returned fälschlicherweise "undefined"

KGD92

Mitglied
Moin Jungs,

ich hab ein kleines Problem und zwar mit den folgenden beiden Funktionen

Javascript:
Login.prototype.login = function () {
	var user = document.forms.login.user.value;
	var pass = document.forms.login.pass.value;
	var response = databaseRequest("login_checkUser&user="+user+"&pass="+pass);
	if (response[0] == "true") {
		createSession(response[1],response[2]);
		loadModul("main");
	}
	else
		errCode(1);
}
Die obige Mehode ruft die Untere auf. Dazu sei noch gesagt das die obere Methode in einer anderen Quelldatei steht als die Untere. Die entsprechende Quelldatei ist als unterste eingebunden.
Javascript:
function databaseRequest (option) {
	ajaxHandle.open("get","database/database.php?function="+option,true);
	ajaxHandle.send(null);
	ajaxHandle.onreadystatechange = function () {
		if (ajaxHandle.readyState == 4 && ajaxHandle.status == 200) {
			var string = ajaxHandle.responseText;
			var response = null;
			if (string.search(/\*/) != -1) {
				response = string.split(/\*/);
				for (x in response) {
					x = x.split(/\|/);
				}
			}
			else {
				if (string.search(/\|/) != -1)
					response = string.split(/\|/);
				else
					response = string;
			}
		}
		return response;
	}	
}

Diese Funktion arbeitet einwandfrei (bestätigt durch debug ausgaben und debugger). Aber trotzdem gibt sie anstatt einen Array ein "undefined" zurück.

Ich hoffe ihr könnt mir helfen ;)

Grüße
 
Zuletzt bearbeitet:
Du vereinbarst die Variable innerhalb des if-Blocks, also ist sie auch nur dort gültig. Mach es so:

Javascript:
function databaseRequest (option) {
    ajaxHandle.open("get","database/database.php?function="+option,true);
    ajaxHandle.send(null);
    ajaxHandle.onreadystatechange = function () {
        var response = null;

        if (ajaxHandle.readyState == 4 && ajaxHandle.status == 200) {
            var string = ajaxHandle.responseText;           
            if (string.search(/\*/) != -1) {
                response = string.split(/\*/);
                for (x in response) {
                    x = x.split(/\|/);
                }
            }
            else {
                if (string.search(/\|/) != -1)
                    response = string.split(/\|/);
                else
                    response = string;
            }
        }
        return response;
    }   
}
 
Okay, das erscheint logisch, löst das Problem leider nicht ich erhalte in der aufrufenden Funktion immer noch "undefined" :(
 
Ja mist, ich hab garnicht gesehen, dass es um einen ajax request geht :-D

Die "databaseRequest"-Funktion enthält gar kein return, deshalb auch undefined.
Das "A" in ajax steht für "asynchron". Das bedeutet, dass die onreadystatechange-Funktion irgendwann aufgerufen wird, sobald sich am Status was ändert, also z.B. der Server antwortet.

Ich baus dir mal grad um, so wie es sein muss. Dauert einen Moment.
 
Habs nicht getestet, sollte dir aber den richtigen Weg zeigen.

Javascript:
Login.prototype.login = function () {
	var user = document.forms.login.user.value;
	var pass = document.forms.login.pass.value;
	//Ist jetzt asynchron
	databaseRequest("login_checkUser&user="+user+"&pass="+pass, function(response) {
		if (response[0] == "true") {
			createSession(response[1],response[2]);
			loadModul("main");
		}
		else
			errCode(1);
	}); 
}

//Weiterer Parameter für die Callback-Funktion
function databaseRequest (option, fn) {
	ajaxHandle.open("get","database/database.php?function="+option,true);
	ajaxHandle.send(null);
	ajaxHandle.onreadystatechange = function () {
		var response = null;
		
		if (ajaxHandle.readyState == 4 && ajaxHandle.status == 200) {
			var string = ajaxHandle.responseText;           
			if (string.search(/\*/) != -1) {
				response = string.split(/\*/);
				for (x in response) {
					x = x.split(/\|/);
				}
			}
			else {
				if (string.search(/\|/) != -1)
					response = string.split(/\|/);
				else
					response = string;
			}
		}
		
		//Kein return mehr, sondern Aufruf der Callback-Funktion
		fn(response);
	}
}
 
Zurück