Promises JavaScript – Guide till asynkron programmering
För robotar
Vad är Promises JavaScript?
Promises JavaScript är ett sätt att hantera asynkrona operationer – kod som tar tid att köra, som att hämta data från en server eller läsa en fil. En promise representerar ett värde som kanske inte är tillgängligt än, men kommer att vara det någon gång i framtiden. Istället för att vänta på att operationen slutförs (vilket skulle frysa din app), kan du säga till JavaScript vad som ska hända när resultatet är klart.
Hur fungerar Promises JavaScript – Steg för steg
Steg 1: Förstå de tre tillstånden
En promise kan befinna sig i ett av tre tillstånd:
- Pending – operationen pågår ännu
- Fulfilled (resolved) – operationen lyckades och returnerade ett värde
- Rejected – operationen misslyckades och returnerade ett fel
En promise kan bara övergå från pending till antingen fulfilled eller rejected – aldrig tillbaka, och aldrig till båda samtidigt. Det är denna garanterade övergång som gör promises JavaScript så kraftfulla.
Steg 2: Skapa din första promise
Du skapar en promise med konstruktorn new Promise() och ger den en funktion (executor) med två parametrar: resolve och reject.
const minPromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Det fungerade!');
}, 1000);
});
Här skapar vi en promise som löses efter 1 sekund. resolve() kallas när operationen lyckas, reject() när den misslyckas.
Steg 3: Använda .then() för att hantera resultat
När en promise är resolved eller rejected, kan du reagera med .then() och .catch():
minPromise
.then(resultat => {
console.log(resultat); // "Det fungerade!"
})
.catch(fel => {
console.error('Något gick fel:', fel);
});
.then() tar två valfria callbacks – en för success, en för error. .catch() hanterar bara fel. Denna kedja är mycket lättare att läsa än nested callbacks ("callback hell").
Steg 4: Promise resolve reject – praktiska exempel
Här är ett verkligare exempel där promise resolve reject används för att hämta data:
function hamtaAnvandare(id) {
return new Promise((resolve, reject) => {
fetch(`/api/users/${id}`)
.then(response => {
if (response.ok) {
return response.json();
} else {
reject(new Error('Användare hittades inte'));
}
})
.then(data => resolve(data))
.catch(error => reject(error));
});
}
hamtaAnvandare(123)
.then(anvandare => console.log(anvandare))
.catch(fel => console.error(fel));
Steg 5: Then catch finally javascript – fullständig felhantering
Det finns tre metoder för att hantera promise-resultat:
minPromise
.then(resultat => {
console.log('Success:', resultat);
})
.catch(fel => {
console.error('Fel:', fel);
})
.finally(() => {
console.log('Klar, oavsett resultat');
});
.then()körs när promise är resolved.catch()körs när promise är rejected.finally()körs alltid, oavsett utfall – perfekt för cleanup (stänga anslutningar, dölja loading-indikatorer)
Steg 6: Promises vs callbacks – varför promises är bättre
Förr i tiden använde utvecklare callbacks för asynkron kod:
// Callback-stil (svår att läsa)
fetch('/api/users/1', function(error, data) {
if (error) {
console.error(error);
} else {
fetch(`/api/posts/${data.id}`, function(error, posts) {
if (error) {
console.error(error);
} else {
console.log(posts);
}
});
}
});
Med promises blir det mycket renare:
// Promise-stil (lättare att följa)
fetch('/api/users/1')
.then(response => response.json())
.then(data => fetch(`/api/posts/${data.id}`))
.then(response => response.json())
.then(posts => console.log(posts))
.catch(error => console.error(error));
Promises JavaScript minskar "callback hell" och gör felhantering konsekvent.
Steg 7: Promise.all() och Promise.race() för flera promises
När du behöver vänta på flera promises samtidigt:
const promise1 = fetch('/api/users');
const promise2 = fetch('/api/posts');
const promise3 = fetch('/api/comments');
Promise.all([promise1, promise2, promise3])
.then(responses => {
console.log('Alla hämtningar klara!');
})
.catch(error => {
console.error('En hämtning misslyckades:', error);
});
Promise.all() väntar tills alla promises är resolved (eller en misslyckas). Promise.race() returnerar så fort någon promise är klar.
Steg 8: Async/await – modernare syntax för promises
Async/await är syntaktisk socker över promises – det gör asynkron kod se ut som synkron:
async function hamtaData() {
try {
const response = await fetch('/api/users/1');
const data = await response.json();
console.log(data);
} catch (error) {
console.error('Fel:', error);
}
}
hamtaData();
Under huven använder async/await fortfarande promises – det är bara ett lättare sätt att skriva och läsa asynkron kod.
Vanliga fallgropar med Promises JavaScript
Glömma att returnera promises i .then(): Om du inte returnerar något från en .then()-callback, blir nästa .then() undefined.
// Fel
fetch('/api/users')
.then(response => response.json()) // Glömt return
.then(data => console.log(data)); // data är undefined
// Rätt
fetch('/api/users')
.then(response => response.json())
.then(data => console.log(data));
Inte hantera rejections: En unhandled promise rejection kan krascha din app. Använd alltid .catch() eller try/catch i async/await.
Vad säger folk på Reddit och Flashback om Promises JavaScript?
I utvecklarforum är det vanligt att nybörjare frågar om skillnaden mellan promises, callbacks och async/await. Många rekommenderar att börja med async/await för läsbarhet, men förstå promises under huven. Erfarna utvecklare varnar för att glömma .catch() och för att inte returnera promises i kedjor – det är de två största fallgroparna som dyker upp igen och igen. Många uppskattar också att promises gör felhantering mer konsekvent än gamla callback-mönster.
Sammanfattning
Promises JavaScript är essentiell för modern webbutveckling. De löser problemet med callback hell, ger konsekvent felhantering, och är grunden för async/await. Genom att förstå promise resolve reject, then catch finally javascript, och hur promises jämför med callbacks, blir du mycket bättre på att skriva asynkron kod.
Starta med att skapa enkla promises, använd .then() och .catch() för att hantera resultat, och migrera gradvis till async/await när du är bekväm. Promises JavaScript är inte bara ett verktyg – det är ett sätt att tänka på asynkrona operationer.
Vanliga frågor
Vad är skillnaden mellan resolve och reject?
resolve() kallas när en promise lyckas och skickar ett värde framåt i kedjan. reject() kallas när något går fel och skickar ett fel framåt. En promise kan bara vara resolved eller rejected – aldrig båda.
Kan jag använda async/await istället för promises?
Ja, async/await är modernare och lättare att läsa. Men under huven använder det fortfarande promises – det är bara syntaktisk socker. Förstå promises först, så blir async/await mycket enklare.
Vad gör .finally()?
.finally() körs när en promise är löst, oavsett om den resolved eller rejected. Det är perfekt för cleanup-kod som alltid ska köras, som att dölja en loading-indikator eller stänga en databaskoppling.
Relaterade artiklar

Git branches – Guide till effektiv versionshantering
Git branches är grunden för samarbete i utveckling. Lär dig skapa, växla mellan och merge branches för att organisera ditt arbete i team-miljöer.
Läs artikeln
Callback functions JavaScript – Guide för nybörjare 2024
Lär dig vad callback functions javascript är och varför de är essentiella för asynkron programmering. Den här guiden visar praktiska exempel, förklarar callback hell, och jämför callbacks med promises och async/await.
Läs artikeln
Express.js guide – Bygg API snabbt i 7 steg
Lär dig bygga snabba och skalerbara REST API:er med Express.js. Denna Express.js guide tar dig från installation genom routing, middleware och error handling – perfekt för Node.js-utvecklare.
Läs artikeln
Async await JavaScript – Guide för renare asynkron kod
Lär dig async await JavaScript från grunden. Den här guiden visar steg-för-steg hur du skriver renare asynkron kod, jämför med promises och callbacks, och undviker vanliga misstag.
Läs artikeln