# Funktion für AJAX - Problem mit Return



## Joggal (13. Jun 2015)

Hallo Leute

Ich habe eine Funktion register(), welche eine Funktion checkUser() aufruft, die true oder false zurückgeben soll, je nachdem, ob der User mit der Email vorhanden (true) oder nicht vorhanden ist (false).

Ich habe allerdings ein Problem, beim zurückgeben des Returnwertes...

Hier mein Code:

```
function checkUser(email) {
	
	var ret;

	$.ajax({
		type : "get",
		url : "../ControllerServlet",
		data : {
			param : "checkUser",
			email : email
		},
		contentType : "application/json; charset=utf-8",
		dataType : "json",
		success : function(data) {
			ret = data.userExists;
		},
		failure : function(data) {
			
		}
	});
	
	alert(ret);

	return ret;
}
```

Ich habe mir mit alert() den Wert von "ret" ausgeben lassen, dieser ist jedoch immer noch "undefined", obwohl ich eig dieser Variable in "success" den Wert zuweise...

Irgendwie wird das aber ignoriert.

Weiß hier jemand was ich falsch mache?

lg


----------



## gp (13. Jun 2015)

Ajax arbeitet (normalerweise) asyncron, der Wert wird erst gesetzt, wenn die Antwort vom Server da ist. Vielleicht das Eingabefeld erst mal rot hinterlegen und wenn die Antwort kommt auf grün setzen (oder die alert-Ausgabe in der success-funktion einbauen.


----------



## Joggal (14. Jun 2015)

Achja stimmt, das liegt am asynchronen Verhalten...  Bräuchte ich da ein Callback oder so, um dann wo anders mit dem Ergebnis weiterarbeiten zu können, und nicht im success bleiben zu müssen? Oder wie geht man da vor?

Mein Problem ist ja einfach, dass ich gern das Ergebnis "aus dem AJAX Teil herausbekommen" möchte, da ich den AJAX Teil in einer eigenen Funktion ausgelagert habe, und in einer anderen Funktion aufrufe.. Und in der Hauptfunktion würde ich gerne mit dem Ergebnis weiterarbeiten.


----------



## gp (14. Jun 2015)

Der Success ist ja schon dein Callbach, ruf von dort aus einfach eine von dir geschriebene Function auf.


----------



## Joggal (14. Jun 2015)

Aber ich möchte ja zurück in die erste Funktion, nicht weiter in eine 3. !

Sprich: 
Funktion a ruft Funktion b auf (funktion b beinhaltet ajax code). Dann möchte ich mein json objekt aus dem success teil auslesen und zurück in funktion a bekommen, um dort wieder weiterarbeiten zu können


----------



## Thallius (14. Jun 2015)

Das geht aber nunmal nicht 

Es geht nur:  Funktion A ruft Funktion B auf. Funktion B kommt zurück ohne ERgebnis und Funktion A läuft irgendwie weiter. Wenn das Ergebnis vorliegt ruft Funktion B die Funbktion C auf.

So ist das nunmal mit Asynchronität 

Gruß

Thallius


----------



## Joggal (14. Jun 2015)

Okay, schade  
Danke aber für eure Hilfe!

Ich hätte da noch eine andere Frage: 
Ich möchte mehrere Zeilen aus einer DB herausholen, welche ich dann im Browser ausgebe.

Die Daten werden von einem Servlet aus der Datenbank (stored procedure) abgerufen, und sollen mittels JSON und AJAX dann an den Client weitergegeben werden. 

Wie realisiere ich das am besten? Ich habe einen Ansatz gesehen, wo direkt am Server die Tabelle zusammengebastelt wird, was ich aber ziemlich unenelegant gelöst finde, weil man so die Tabelle nicht wirklich schön formatieren kann und es ziemlich unpraktisch ist, die Tabelle so zusammenzustellen.

Da wäre es doch besser, die Grundstruktur der Tabelle schon im HTML file zu erstellen, und dann per Ajax jede einzelne Row zurückzugeben und mit js dann einzubauen, oder?

Jedoch weiß ich nicht ganz, wie ich das so realisiere...

Kann mir vllt. hier noch jemand helfen?


----------



## gp (14. Jun 2015)

Die Frage ist doch, was willst du eigentlich erreichen? Ich vermute mal, dass dein Eingabefeld manipuliert werden soll (wird rot oder es kommt eine Meldung). Nun, das alles geschieht  asyncron in deiner function - eben etwas zeitversetzt. Ein zurück mit "goto" oder so ist (zum Glück) nicht machbar.


----------



## gp (14. Jun 2015)

Zur Datenbank:
Ich kenne ja den Anwendungsfall  nicht. Normalerweise würde ich die Seite komplett per HTML auf dem Server aufbauen, schön formatieren ist möglich, das sollte nicht das Thema sein.
Mit AJAX kämen dann dynamische Änderungen ins Spiel. Es kämen eine oder besser alle neuen Zeilen an (oder der komplette Inhalt), per JavaScript würde dann der DOM manipuliert. 

Ich gehe jetzt nicht auf Details ein - dazu fehlt mir die Zeit. Spätestens jetzt kommen Frameworks wie JQuery ins Spiel ...


----------



## Joggal (14. Jun 2015)

Naja also... das Servlet soll lediglich für AJAX Calls dienen. Diese werden mit einem Paremter abgefragt und geben dann die jeweiligen Daten aus der DB zurück an den Client. Im Servlet selbst soll sich kein HTML Code befinden. (unpraktisch weil man hier alles in ein out.println schreiben muss) 

Und jetzt stellt sich aber die Frage, wie ich denn das mache, wenn ich mehrere Zeilen zurückgeben möchte. Eben für eine Tabellenausgabe.


----------



## gp (14. Jun 2015)

HTML gehört nicht in Servlets, die leiten klassischerweise für die Ausgabe zu JSP-Seiten weiter (altpacken aber einfach).

Json-Arrays sind die Lösung, die mappen sich recht einfach auf simple Javacript container - aber wie gesagt, jetzt beginnt ein Grundlagenkurs ...


----------



## Thallius (14. Jun 2015)

HTML gehört doch sowieso nicht in eine Applikation. Dann kann ich ja auch gleich eine Web-App machen und den Browser nehmen. Da brauche ich kein Java...

Ich würde per Ajax nur die Daten als JSON Array holen. Der Rest erledigt die Client Software.

Gruß

Claus


----------



## Joggal (14. Jun 2015)

okay, ja so meinte ich das ja auch! Also alle Daten auslesen und in ein JSON Array verpacken und dann ab zum client?


----------



## gp (14. Jun 2015)

Ja, genau so. Aber so oder so: um ein HTML-Grundgerüst kommst du  nicht rum, oder? So als erste Antwort. Das kann natürlich auch später per Ajax gefüllt werden - oder eben sofort über eine JSP-Seite. Ich bin schon ein Freund davon, so viel wie möglich auf Server-Seite zu erledigen. Ohne JavaScript-Frameworks ist das sonst sehr mühsam.


----------



## Joggal (14. Jun 2015)

Ja klar, im HTML File ist ja schon eine Tabellenstruktur angelegt. Befüllt soll sie aber dann dynamisch werden, je nachdem, welche Option ich auswähle. 

Bsp: In einer DB sind verschiedene Motorräder enthalten. Im Browser soll dann mit Tabs zwischen den Arten (MX, Enduro,...) wählbar sein, welche ich anzeigen möchte. Wenn ich jetzt zum Beispiel auf MX drücke, kommt eine Tabelle mit allen MX Modellen (125ccm, 250ccm,..)

Und da war eben meine Frage, wie ich das auf Serverseite realisiere. Ich möchte nämlich nicht direkt am Server die Tabelle zusammenbauen und diese dann als ganzes zurückschicken, sondern dann auf Clientseite mittels JS in einer Schleife die einzelnen Spalten befüllen.

Sprich: Wenn ich meine Stored Procedure aufrufe, soll ich dann am besten das ResultSet durchlaufen und alle einzelnen Rows in einen 2-dimeonsionalen Array speichern, welchen ich dann per JSON an den Client sende?


----------

