Hallo borisbaer,
fetch(tabName) { $(".append").html(html); };
Du schreibst
fetch(tabName)
.then(function(response) {
if (response.ok)
return response.text();
else
throw 'Tab konnte nicht geladen werden';
})
.then(function(html) {
$(".append").html(html);
})
.catch(function(message) {
// Fehlerbehandlung
});
Fetch funktioniert in 3 Schritten. jQuery kapselt Dir das.
Schritt 1: Absenden des HTTP Requests. Das macht fetch(tabName). Du bekommst ein Promise zurück; ein Objekt, das Dir das Versprechen macht, irgendwann Daten zu liefern.
Auf diesem Promise rufst Du die Methode .then() auf. Mit then registrierst Du eine Funktion - einen Callback - der aufgerufen wird, wenn das Versprechen eingelöst wird.
Schritt 2: Dieser Callback bekommt aber noch nicht die fertigen Daten übergeben, sondern erstmal nur ein "Response" Objekt. Je nachdem, ob der Server mit HTTP 200 oder 40x geantwortet hat, ist die ok Eigenschaft der Response auf true oder false. Das fragst Du ab, und wenn es ok war, DANN kannst Du den Text der Response lesen. Das geschieht wiederum asynchron (weil erstmal von Netzwerk gelesen werden muss), und response.text() liefert Dir ein neues Promise, mit dem Versprechen auf den Text, den der Server geliefert hat.
Schritt 3: Und DER geht dann an den Callback des zweiten .then Aufrufs.
Das ist ein Grundsatzmechanismus von Promises. Die .then Methode liefert immer ein neues Promise zurück, d.h. Du kannst .then Aufrufe aneinander hängen. Genau das passiert oben:
fetch().then().then();
Es ist nur anders aufgeschrieben, so dass die .then jeweils am Zeilenanfang stehen. Deswegen gibt's auch kein Semikolon hinter fetch(...).
Wenn ein then Handler einfach nur einen Wert zurückliefert, geht der 1:1 weiter an den nächsten then. Aber wenn ein Promise zurückkommt, dann wird das Ergebnis dieses Promise an den nächsten then Handler übergeben, sobald sich das Promise erfüllt. Man kann auf diese Weise also mehrere asynchrone Abläufe aneinander koppeln.
Im Fehlerfall steht da throw Error(). Das ist der JavaScript Exception-Mechanismus. Eine mit throw geworfener Wert kann mit einem try-catch Konstrukt gefangen werden (-> Selfwiki). Darum kümmert sich bei Promises die then-Funktion (then selbst, nicht dein Callback, den Du then übergeben hast). Sie fängt den geworfenen Wert und bricht die then-Kette ab. Um den Error verarbeiten zu können, brauchst Du noch einen .catch Aufruf auf der Promise-Kette, um einen Callback für den Fehlerfall zu registrieren.
fetch()
.then()
.then()
.catch(function(error) { ... });
Den .catch-Handler musst Du nicht registrieren. Lässt Du ihn weg, wird ein Error in der Konsole der Entwicklerwerkzeuge notiert, aber das Programm läuft weiter. Aber wenn doch, bekommst Du genau das Ding übergeben, das mit throw geworfen wurde.
Warning: Undefined array key "subpage" in E:\Webseiten\games\index.php on line 37
Das sollte nur kommen, wenn der subpage Parameter nicht bei PHP ankommt. Kommt das nur, wenn Du die Seite ohne Parameter aufrufst? Wenn ja, und es bei Strato nicht kommt, kann das auch am unterschiedlichen error reporting der PHP Installationen liegen. Zeigt PHP auf dem Server überhaupt Warnungen an? Was liefert Dir die Funktion error_reporting(), bzw. ini_get("error_reporting") - vergleiche das mal mit deiner lokalen Kiste.
$_SERVER['DOCUMENT_ROOT']
Musst Du das überhaupt tun? Ein include sollte doch, meine ich, zuerstmal in dem Ordner schauen, in dem das PHP Script gestartet wurde. Wenn also Includierer und Includierter im gleichen Ordner stehen, müsste es auch ohne expliziten Pfad klappen. Das PHP Handbuch schreibt:
Dateien werden unter dem angegebenen Pfad gesucht oder, wenn keiner gegeben ist, im include_path. Wenn die Datei auch im include_path nicht gefunden werden kann, sucht include noch im Verzeichnis der aufrufenden Datei und im aktuellen Arbeitsverzeichnis.
include_path ist eine Einstellung in der php.ini.
Rolf
sumpsi - posui - obstruxi