Produkte aus einer Datei
Bisher standen die Startprodukte direkt in script.js. Apps halten ihre Daten meistens getrennt vom Code, in einer Datei oder auf einem Server, und laden sie, wenn die Seite geöffnet wird. Deine Liste macht das jetzt auch. Ihre Startprodukte stehen jetzt in der Datei produkte.json, im dritten Tab des Editors. Es sind die aus dem Array, dazu Kaffee, damit du siehst, wann die Liste aus der Datei kommt.
Wie du eine Datei lädst, kennst du aus der Lektion über Daten von einem Server. fetch() fragt danach, die Antwort kommt einen Moment später, also wartet eine async-Funktion mit await darauf. antwort.ok sagt, ob die Datei gefunden wurde, und await antwort.json() wandelt ihr JSON in ein Array von Objekten um, genau wie das in produkte:
async function ladeProdukte() {
const antwort = await fetch("produkte.json");
produkte = await antwort.json();
zeigeProdukte();
}Die Funktion legt ein neues Array in produkte, und eine Konstante kann keinen neuen Wert bekommen, also erstelle produkte jetzt mit let. Es beginnt als leeres Array, [], weil die Liste leer ist, bis die Datei ankommt.
Warum ruft ladeProdukte() selbst zeigeProdukte() auf? Weil die Produkte erst nach dem await da sind. Der Code nach ladeProdukte(); am Ende des Skripts läuft sofort, bevor die Datei ankommt, also würde ein zeigeProdukte() dort eine leere Liste zeigen.
Das Laden dauert einen Moment: eine Drittelsekunde in der Vorschau, mehrere Sekunden bei einer langsamen Verbindung. Währenddessen sagt eine gute App, was los ist. Und wenn die Datei nicht geladen werden kann, sagt sie auch das, statt nur eine leere Liste zu zeigen.
Typische Fehler:
const produktebeibehalten. Die Konsole zeigt dannTypeError: Assignment to constant variable.awaitvorantwort.json()vergessen.produkteenthält dann ein Promise statt des Arrays, undzeigeProdukte()endet mitTypeError: produkte is not iterable.
So schreibst du es:
Anweisungen
- 1
Ändere
produktein ein leeres Array, das sich ändern kann:let produkte = [];. Schreibe unterzeigeProdukte()die FunktionladeProdukte()von oben. Rufe am Ende des SkriptsladeProdukte()stattzeigeProdukte()auf. Nach einem Moment zeigt die Seite vier Produkte, darunter den Kaffee, undZu zahlen: 16 €. - 2
Zeige am Anfang von
ladeProdukte()Lade…innachrichtan. Leere die Meldung wieder (nachricht.textContent = ""), sobald die Produkte angekommen sind. - 3
Wenn die Datei nicht geladen werden kann (
antwort.okistfalse), zeigeDie Liste konnte nicht geladen werden.innachrichtan und beende die Funktion mitreturn, vorantwort.json(). Probiere es aus: Ändere den Namen infetch()zuprodukt.json, einer Datei, die es nicht gibt, und führe den Code aus. Ändere ihn danach wieder zurück.