Wykonujemy proste ćwiczenie, które ma nam utrwalić materiał z lekcji poprzednich, o async await oraz fetch API. Do dzieła.

Ok, zaczniemy od stworzenia stałych z URLami:

const API_URL = "https://api.chucknorris.io/jokes/random";
const API_URL_WRONG = "https://api.chucknorris.io/jokes/randomz";
const ANOTHER_WRONG_URL = "https://api.chucknorizz.io/jokes/random";

Ok, fajnie, piszemy funkcję async await:

async function getJSON(url){
    const response = await fetch(url);

    if(!response.ok)
        return [new Error("Response failed, check URL"), null];

    const resBody = await response.json();

    return [null, resBody];
}

Jak w node, zwracamy error i wynik. Wygląda ok, teraz aby sprawdzić, jak to działa, użyjemy async IIFE.

Tak – IIFE może być async! Ok:

(async () => {

    const [err, joke] = await getJSON(API_URL);

    if(err)
        console.warn(err.message);
    else
        console.log(joke);

    
})();

Pierwszy URL da nam dowcip, drugi błąd przez nas obsłużony (sami go przekazaliśmy), trzeci jednak da nam totalnie nieobsłużony wyjątek (zadziałało cors, bo mamy jakąś dziwną domenę a nie tylko resztę adresu lekko wadliwą, gdzie po prostu element adresu był nie taki).

To też możemy obsłużyć:

async function getJSON(url){
    try {
        const response = await fetch(url);
        
        if(!response.ok)
            return [new Error("Response failed, check URL"), null];

        const resBody = await response.json();

        return [null, resBody];
    }
    catch(e){
        return [e, null];
    }
    

}


(async () => {

    const [err, joke] = await getJSON(ANOTHER_WRONG_URL);

    if(err)
        console.warn(err.message);
    else
        console.log(joke);

    
})();

Teraz error związany z tym, że jest zła domena i przeglądarka blokuje CORS jest tak samo obsługiwany, jak error, że na zły endpoint pokazaliśmy i obsługujemy go sobie po swojemu, wyświetlając warnem message.

Takie małe przypomnienie z try-catch bo tego też używać będziemy. Więcej JS już niedługo, chciałbym tylko na jedno zwrócić uwagę:

  • w React RFC nie może być async ani callback do useEffect
  • w React możemy zdefiniować funkcję async powyżej RFC lub wewnątrz useEffect i tam ją zawołać
  • często jest taki modus operandi – useEffect z pustą tablicą zależności, zaciąga async na initial render, ale po nim (coś zatem trzeba wyrenderować), i jak wykona się await to używa setState, który wykonuje re-rener z nowym stanem i wszystko się wyświetla