Alla artiklar

Promises JavaScript – Guide till asynkron programmering

För robotar
3 augusti 2026
Promises JavaScript – Guide till asynkron programmering

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:

  1. Pending – operationen pågår ännu
  2. Fulfilled (resolved) – operationen lyckades och returnerade ett värde
  3. 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