JavaScript
Asynkron JavaScript
Noget kode tager tid, for eksempel at hente data over nettet. I stedet for at stå og vente går JavaScript videre og tager fat i svaret, når det kommer. Det håndteres med promises, og de skrives lettest med async og await.
Forudsætter, at du har set funktioner i javascript .
Problemet: noget tager tid
Din kode kører normalt én linje ad gangen, oppefra og ned. Men at hente data fra en server tager måske et halvt sekund. Hvis programmet stod stille imens, ville hele siden fryse.
Løsningen er, at JavaScript sætter den langsomme opgave i gang, går videre med resten af koden, og først vender tilbage til opgaven, når svaret er der.
console.log("1: før");
setTimeout(() => {
console.log("2: inde i ventetiden");
}, 500);
console.log("3: efter"); Output
Tryk på “Kør koden”.
Rækkefølgen bliver 1, 3, 2. Det er ikke en fejl. Det er hele pointen. Og det er også forklaringen på den fejl, alle laver første gang de henter data: linjen efter kaldet kører, før svaret er kommet.
Et promise er en kvittering
Når du starter noget, der tager tid, får du ikke resultatet. Du får et promise: en kvittering, der på et tidspunkt enten bliver indfriet med en værdi eller fejler.
const loefte = new Promise((indfri) => {
setTimeout(() => indfri("Her er svaret"), 300);
});
console.log(loefte);
loefte.then((svar) => console.log(svar)); Output
Tryk på “Kør koden”.
Skriver du kvitteringen ud med det samme, står der Promise { <pending> }. Den
venter stadig. .then() siger: “når den er indfriet, så gør det her”.
async og await gør det læsbart
.then() bliver hurtigt uoverskueligt, når flere ting skal ske efter hinanden.
await gør det samme, men skrevet som almindelige linjer nedad.
function vent(ms, vaerdi) {
return new Promise((indfri) => setTimeout(() => indfri(vaerdi), ms));
}
async function hentAlt() {
console.log("starter");
const a = await vent(200, "første");
console.log(a);
const b = await vent(200, "andet");
console.log(b);
return "færdig";
}
hentAlt().then((slut) => console.log(slut)); Output
Tryk på “Kør koden”.
To regler, og de hænger sammen:
awaitmå kun stå inde i en funktion, der er markeretasync.- En
async-funktion returnerer altid et promise, også når du returnerer en almindelig værdi.
Fejl fanges med try og catch
Går det galt undervejs, serveren svarer ikke, netværket er væk, kastes en fejl.
Den fanger du med try/catch, ellers stopper din funktion uden at sige hvorfor.
function fejler() {
return new Promise((indfri, afvis) => {
setTimeout(() => afvis(new Error("Serveren svarer ikke")), 200);
});
}
async function proev() {
try {
const svar = await fejler();
console.log(svar);
} catch (fejl) {
console.log("Fanget: " + fejl.message);
}
}
proev(); Output
Tryk på “Kør koden”.
Det mønster, async, await, try/catch, er præcis det, du skriver hver
gang du henter data med fetch.
Kort opsamling
- Langsomme opgaver blokerer ikke; koden går videre imens.
- Et promise er kvitteringen på noget, der endnu ikke er færdigt.
awaitventer på kvitteringen, og kræverasyncpå funktionen.- Pak altid
awaitind itry/catch, når noget kan gå galt.
Læs videre
- fetch - hent data fra et API Sådan bruger du fetch i JavaScript til at hente data fra et API. Forklaret på dansk, med fejlhåndtering, statuskoder og de fælder alle falder i.
- Hvad er et API? Hvad er et API? Forklaret på dansk uden fagsprog, med et konkret eksempel på et kald, hvordan svaret ser ud, og hvad en API-nøgle er til.
- Funktioner i JavaScript Funktioner i JavaScript forklaret på dansk: parametre, return og kald. Med eksempler du kan køre, og forklaringen på hvorfor din funktion giver undefined.
Senest gennemgået .