I denne leksjonen skal vi lære om hvordan vi kan hente data fra en ekstern kilde ved hjelp av fetch-funksjonen, samt forstå hvorfor vi må bruke await- og async-nøkkelordene i JavaScript for å håndtere asynkrone operasjoner på en enkel måte. Vi skal også se på hvordan vi kan opprette nye HTML-elementer og legge dem til i DOM-en basert på data vi har hentet.
Oversikt:
fetch er en innebygd funksjon i JavaScript som lar oss gjøre nettverksforespørsler til servere for å hente ressurser som JSON-data, bilder, eller andre filer. Den returnerer et Promise som løses når svaret fra serveren er mottatt.
async og await er syntaktiske konstruksjoner i JavaScript som gjør det enklere å jobbe med asynkrone operasjoner, som nettverksforespørsler. Tanken er altså at noen operasjoner kan ta tid, og i noen tilfeller må vi vente på disse før vi går videre. Når en funksjon er merket med async, kan vi bruke await inne i den funksjonen for å pause utførelsen av koden til et Promise er løst.
Her er et enkelt eksempel på hvordan vi kan bruke fetch for å hente data fra en offentlig API. Vi bruker https://api.chucknorris.io/ som et eksempel, som gir oss tilfeldige Chuck Norris-vitser. Les mer på nettsidene for hvordan du kan bruke API-et.
async function hentData(){
let response = await fetch("https://api.chucknorris.io/jokes/random");
let data = await response.json();
console.log("Alle data:");
console.log(data);
console.log("\nBare vitsen:");
console.log(data.value)
}
hentData();
Legg merke til at:
hentData som en async funksjon, slik at vi kan bruke await inne i den.await foran fetch og response.json(), noe som gjør at koden venter på at disse operasjonene skal fullføres før den går videre.Etter at vi har hentet dataene, kan vi opprette nye HTML-elementer og legge dem til i DOM-en for å vise informasjonen på nettsiden. Her er et eksempel på hvordan vi kan gjøre dette.
Vi tar som utgangspunkt en enkel HTML-side:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Chuck Norris, sa du?</title>
<link rel="stylesheet" href="stilark.css">
<script src="chuck.js" defer></script>
</head>
<body>
<h1>Har du høyrt denne?</h1>
<div id="vits">
<!-- fylles ut av JavaScript -->
</div>
</body>
</html>
Vi bruker enkel CSS:
html, body {
height: 100%;
}
body {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
/* https://cssgradient.io/ */
background: rgb(63,94,251);
background: radial-gradient(circle, rgba(63,94,251,1) 0%, rgba(252,70,107,1) 100%);
text-align: center;
}
p {
font-size: 1.5em;
color: white;
}
h1 {
font-size: 2em;
color: rgb(213, 255, 74);
}
Og her er JavaScript-koden som henter en vits og legger den til i DOM-en:
async function hentVits() {
const res = await fetch('https://api.chucknorris.io/jokes/random');
const data = await res.json();
// Tømmer sida for gamle vitsar
document.querySelector("#vits").innerHTML = "";
// Opprettar ein ny vits i ein paragraf
let vits = document.createElement("p");
vits.innerText = data.value;
document.querySelector("#vits").appendChild(vits);
// Legg til eit bilete av Chuck Norris
let bilde = document.createElement("img");
bilde.src = data.icon_url;
document.querySelector("#vits").appendChild(bilde);
}
hentVits(); // Slik at me får ein vits med ein gong me lastar sida
// Slik kan me hente ein vits kvar gong me trykker på ein knapp på tastaturet
document.body.addEventListener("keydown", hentVits);
I dette eksemplet:
<p>-element og setter tekstinnholdet til vitsen vi hentet.#vits-elementet på nettsiden, slik at vitsen vises for brukeren.<img>-element for å vise et bilde av Chuck Norris, og legger det til på samme måte.Du kan se ferdig kode her dersom du får problemer: Chuck Norris, REST API.