Asychrones Nerdfutter

Ich weiß ja, dass einige Nutzer über Suchbegriffe zu meiner Seite finden, die sehr IT-lastig sind. Meine kleinen Notizen und Code-Beispiele sollen Menschen helfen, deren Lage ähnlich die der meinen ist. Ich suche oft nach Lösungen zu bestimmten Problemen und finde sie oft nicht – weil ich dann vielleicht doch zu praktisch veranlagt bin und mir die fehlende Theorie über konkrete Beispiele aneigne.

Nachfolgender Code-Schnipsel ist das Ergebnis einer langen Problemsuche, bei der ich sogar die Netzwerkfachleute bei meinem Kunden aufgescheucht habe. Ich hatte wirklich geglaubt, dass der Fehler dort irgendwie im Netzwerk zu finden ist – aber das war, Stand heute, wohl doch nicht der Fall. Lösung des Problems war eine Kleinigkeit – aber die muß man erstmal wissen.

Wenn man eine Web-Applikation baut und diese mit einer Datenbank verbindet, dann findet zwischen dem Client und dem Server eine besondere Interaktion statt. Da auf der Clientseite niemals Datenbankanweisungen als Klartext sichtbar sein dürfen – jeder Browser kann den Quelltext einer jeden Seite anzeigen – müssen die serverseitigen Anweisungen auf dem Server erfolgen. Die Programmiersprache hierfür ist PHP.

Aber der Nutzer der Seite interagiert mit der Applikation auf der Clientseite. In dem er z.B. ein Passwort eingibt. Das erfolgt dann vermutlich über Javascript und mit einem der passenden Frameworks. D.h. diese Eingabe muss auf dem Server landen, also vom Client (Javascript) an den Server (PHP) übergeben werden. Diesen Mechansimus nennt man AJAX (Asynchronous JavaScript and XML) . Das A steht also für asynchron, d.h. die Auswertung auf dem Server ist dem Input nachgelagert und muss erst ein Feedback zurückgeben.

Ich bin da in eine böse Falle getappt, denn es gibt einen großen Unterschied bei diesem Feedback des Servers zwischen zwei Stati: complete und success. Das war mir nicht bekannt. Und wer oberflächlich nach Lösungen zu ähnlichen Problemen sucht, wird diesen Zusammenhang vielleicht auch erst viel zu spät begreifen. Vermutlich liegt das daran, dass AJAX Requests eher selten für das Erzeugen einer Datei verwendet werden.

Der AJAX Request gibt das Feedback success wenn er erfolgreich abgearbeitet wurde. Das Feedback complete wird ausgelöst, wenn das Ergebnis des Requests vorliegt und ist unabhängig von success (kann also auch bei einem Fehler ausgelöst sein, wenn ein Ergebnis nur teilweise vorliegt).

Konkretes Beispiel: Ich wollte anhand von zwei Clientseitigen Parametern (z.B. zwei Userangaben) das Erzeugen einer Datei auf dem Server auslösen und diese Datei dann als Input in meiner Applikation nutzen. Da ich bisher nur das Feedback success kannte und mich mit complete nie beschäftigt habe, fand diese Einbindung immer bei dem success Feedback statt. Das ist aber falsch, denn success bedeutet, die Dateierzeugung wurde erfolgreich initiiert (damit ist der AJAX Request erfolgreich abgeschlossen). Fertig ist der Request aber erst mit der vollständigen Datei und dem complete Feedback.

Ich habe also die ganze Zeit herumgerätselt, warum ich meine Datei manchmal nicht in mein Programm einbinden konnte. Da wir hier im Milisekundenbereich sind kam es ab und an vor, dass die Datei mit dem success Feedback schon vorlag und alles war OK – manchmal aber auch nicht. Die Einbindung muss also mit dem complete Feedback des AJAX Requests verbunden sein – nicht mit success. So erklärt sich der zunächst naheliegende Gedanke, dass im Netzwerk ein Problem vorliegt, welches die Datei blockiert. Naheliegend, aber falsch.

So sieht das konkret aus:

Dumm, wenn einem Nerd der Unterschied zwischen success und complete nicht geläufig ist …