Položky ze souboru
Zatím jsou počáteční položky napsané přímo ve script.js. Aplikace ale svá data obvykle drží odděleně od kódu, v souboru nebo na serveru, a načtou si je, když se stránka otevře. Totéž teď bude dělat i váš seznam. Jeho počáteční položky jsou v souboru polozky.json na třetí záložce editoru. Jsou to ty z pole a navíc káva, abyste poznali, že seznam přišel ze souboru.
Jak soubor načíst, víte z lekce o datech ze serveru. Funkce fetch() o něj požádá a odpověď přijde až za chvíli, takže na ni funkce označená async počká pomocí await. Vlastnost odpoved.ok řekne, jestli se soubor našel, a await odpoved.json() převede jeho JSON na pole objektů, stejné jako to v polozky:
async function nactiPolozky() {
const odpoved = await fetch("polozky.json");
polozky = await odpoved.json();
zobrazPolozky();
}Funkce vkládá do polozky nové pole, jenže konstanta novou hodnotu dostat nemůže. Vytvořte proto polozky teď pomocí let, a to jako prázdné pole, [], protože dokud soubor nepřijde, je seznam prázdný.
Proč nactiPolozky() volá zobrazPolozky() sama? Protože položky jsou k dispozici až za await. Kód za nactiPolozky(); na konci skriptu se provede hned, dřív, než soubor přijde, takže zobrazPolozky() by tam zobrazila prázdný seznam.
Načítání chvíli trvá: v náhledu třetinu sekundy, na pomalém připojení klidně několik sekund. Dobrá aplikace mezitím ukáže, co se děje. A když se soubor načíst nepodaří, řekne to, místo aby jen zobrazila prázdný seznam.
Typické chyby:
- Ponechané
const polozky. Konzole pak ukážeTypeError: Assignment to constant variable. - Zapomenuté
awaitpředodpoved.json(). Vpolozkypak místo pole bude objekt Promise azobrazPolozky()skončí chybouTypeError: polozky is not iterable.
Jak psát:
Pokyny
Vytvořte polozky pomocí let jako prázdné pole: let polozky = [];. Pod funkci zobrazPolozky() napište funkci nactiPolozky() z ukázky. Na konci skriptu zavolejte místo zobrazPolozky() funkci nactiPolozky(). Za chvíli stránka ukáže čtyři položky, mezi nimi kávu, a K zaplacení: 220 Kč.
Na začátku funkce nactiPolozky() zobrazte v odstavci zprava text Načítám…. Až položky přijdou, zprávu zase vymažte (zprava.textContent = "").
Když se soubor načíst nepodaří (odpoved.ok je false), zobrazte v odstavci zprava text Seznam se nepodařilo načíst. a funkci ukončete pomocí return, ještě před odpoved.json(). Vyzkoušejte to: změňte název ve fetch() na polozkyy.json, tedy soubor, který neexistuje, a spusťte kód. Pak ho vraťte zpátky.