sandra-larsson
Educator Fullstack Developer Javascript at Chas Academy
FJS26 · V47 · ONSDAG
Samma promises, och allt som kan gå fel.
Chas Academy · Onsdag 18 november 2026
Igår: en promise är ett värde som kommer senare. Idag: hur vi väntar på det, och vad vi gör när det inte kommer.
ASYNC OCH AWAIT
fetch(url) .then((response) => response.json()) .then((user) => console.log(user.name)) .catch((error) => console.error(error));
const getUser = async () => {
try {
const response = await fetch(url);
const user = await response.json();
console.log(user.name);
} catch (error) {
console.error(error);
}
};ASYNC OCH AWAIT
const getNumber = async () => 42;
getNumber(); // Promise { 42 }
await getNumber(); // 42const demo = async () => {
console.log('A');
await wait(0);
console.log('B');
};
demo();
console.log('C');
// A, C, BDet som skiljer en app som fungerar från en som ser trasig ut.
FELHANTERING
const response = await fetch(
'.../users/999',
);
response.status; // 404
response.ok; // false
await response.json(); // {}404 och 500 är svar från servern. Nätverket fungerade, så för fetch gick det bra.
fetch kastar bara fel när det inte kommer något svar alls: ingen uppkoppling, fel domän, CORS.
FELHANTERING
Kolla response.ok på ett ställe, i stället för i varje anrop.
const fetchJson = async (url, options) => {
const response = await fetch(url, options);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return await response.json();
};try {
const user = await fetchJson(url);
show(user);
} catch (error) {
showError(error.message);
}FELHANTERING
const showUser = async (id) => {
status.textContent = 'Laddar...';
button.disabled = true;
try {
const user = await fetchJson(urlFor(id));
status.textContent = user.name;
} catch (error) {
status.textContent = 'Kunde inte hämta. Försök igen.';
} finally {
button.disabled = false;
}
};try: det som ska hända när allt går bra.
catch: ett fel som användaren förstår, inte bara console.log.
finally: det som ska hända oavsett, som att sätta på knappen igen.
Fånga felet där du vet vad som ska hända. Hjälpfunktionen vet inte det, så den kastar vidare. Den som visar sidan bestämmer.
FLERA ANROP
FLERA ANROP
const a = await fetchJson(userUrl(1)); const b = await fetchJson(userUrl(2)); const c = await fetchJson(userUrl(3));
const [a, b, c] = await Promise.all([ fetchJson(userUrl(1)), fetchJson(userUrl(2)), fetchJson(userUrl(3)), ]);
FLERA ANROP
Ger upp vid första felet. De som lyckades får du aldrig se. Bra när du behöver alla för att kunna visa något.
Väntar på alla och berättar hur det gick för var och en.
const results = await Promise.allSettled([...]);
results.map((r) =>
r.status === 'fulfilled'
? r.value.name
: r.reason.message,
);FLERA ANROP
const timeout = (ms) =>
wait(ms).then(() => {
throw new Error('För långsamt');
});
await Promise.race([
fetchJson(slowUrl),
timeout(2000),
]);race slutar vänta, men anropet fortsätter i bakgrunden. Vill du verkligen avbryta det behövs en AbortController.
AVBRYTA
let controller = null;
start.addEventListener('click', async () => {
controller?.abort();
controller = new AbortController();
try {
await fetch(url, { signal: controller.signal });
} catch (error) {
if (error.name === 'AbortError') return;
showError(error);
}
});
cancel.addEventListener('click', () => controller?.abort());En sökning där användaren skriver vidare: avbryt den förra innan nästa startar, annars kan ett gammalt svar komma sist och skriva över det nya. Ett avbrutet anrop är inget fel. Visa det inte som ett.
AVBRYTA
try {
await fetch(url, {
signal: AbortSignal.timeout(5000),
});
} catch (error) {
error.name; // 'TimeoutError'
}TypeError: inget svar alls, till exempel utan nät.
AbortError: någon avbröt.
TimeoutError: tiden tog slut.
Och ditt eget Error när response.ok är false.
Övning
Gör del 4: koppla en AbortController till knapparna Starta och Avbryt, visa Avbrutet i stället för ett fel, och prova AbortSignal.timeout(2000) mot https://httpbin.org/delay/5.
10 min
Du kan avbryta ett anrop och skilja ett avbrott från ett fel.
Data från ett API har inte alltid alla fält.
DATA SOM SAKNAR FÄLT
user.address.city // TypeError: Cannot read properties // of undefined (reading 'city')
user.address?.city // undefined controller?.abort() // anropas bara om controller finns
DATA SOM SAKNAR FÄLT
Båda ger ett reservvärde. Frågan är vad som räknas som saknat.
'', 0, false, null och undefined.
const orders = 0; orders || 'okänt'; // 'okänt'
Noll beställningar är fortfarande ett svar.
const orders = 0; orders ?? 'okänt'; // 0
EFTER PASSET
fetchJson, de tre lägena, Promise.allSettled, AbortController och ??.By sandra-larsson