FJS26 · V47 · TISDAG

Event loop
och promises

Vad gör JavaScript medan det väntar?

Chas Academy · Tisdag 17 november 2026


Idag

01Synkront och asynkront02Event loop03Callbacks04Promises05Efter passet
EVENT LOOP OCH PROMISES2 / 28
”

Ni har skrivit await fetch sedan v43. Idag tittar vi under ytan: vad gör JavaScript medan det väntar?

01

Synkront och
asynkront

SYNKRONT OCH ASYNKRONT


Vad loggas?

Gissa först. Ändra sedan 1000 till 0.

Koden

console.log('A');

setTimeout(() => {
  console.log('B');
}, 1000);

console.log('C');

Svaret

A, C, B. Och det blir samma ordning med 0 ms. setTimeout lämnar över väntandet till webbläsaren, och callbacken får vänta tills all synkron kod har kört klart.

EVENT LOOP OCH PROMISES5 / 28

SYNKRONT OCH ASYNKRONT


JavaScript gör en sak i taget

  • Synkront: rad för rad. Nästa rad väntar på den förra.
  • JavaScript har en tråd. Medan en funktion kör kan inget annat hända: inga klick, ingen omritning av sidan.
  • Om JavaScript själv väntade på ett fetch i två sekunder skulle sidan frysa i två sekunder.
  • Asynkront: väntandet lämnas över till webbläsaren. JavaScript fortsätter, och får tillbaka en callback när det är klart.
EVENT LOOP OCH PROMISES6 / 28

SYNKRONT OCH ASYNKRONT


Det som tar tid

Allt det här lämnas över till webbläsaren, eller till Node.

Nätverk

fetch: frågor till en server.

Timers

setTimeout och setInterval.

Händelser

Klick, tangenter, formulär: addEventListener.

Filer och databaser

I Node: läsa och skriva filer, fråga en databas.

EVENT LOOP OCH PROMISES7 / 28
02

Event loop

Webbläsarens sätt att hålla ordning på allt som väntar.

Call stack

Där JavaScript håller reda på vilken funktion som körs just nu. Ett anrop läggs överst, och tas bort när funktionen är klar.

  • En stack: den som lades på sist tas bort först.
  • JavaScript kör bara det som ligger överst. När stacken är tom har JavaScript inget att göra.
EVENT LOOP OCH PROMISES9 / 28

EVENT LOOP


Fyra delar

Call stackmain()console.log('A')en sak i tagetWebbläsaren: Web API:ersetTimeoutfetchclickväntar åt JavaScriptMicrotask queuethen, catch, await() => log('promise')Task queuesetTimeout, events() => log('timeout')event loop
EVENT LOOP OCH PROMISES10 / 28

EVENT LOOP


Två köer, en regel

Microtask queue

then, catch, finally och koden efter await. Töms helt varje gång call stacken blir tom.

Task queue

setTimeout, setInterval och events. En i taget, och bara när microtask-kön är tom.

EVENT LOOP OCH PROMISES11 / 28

EVENT LOOP


Steg för steg

Koden

setTimeout(() => log('timeout'), 0);

Promise.resolve()
  .then(() => log('promise'));

log('synkront');

Vad händer

1. setTimeout lämnas till webbläsaren, som lägger callbacken i task queue. 2. then lägger sin callback i microtask queue. 3. synkront loggas. 4. Stacken är tom: först promise, sedan timeout.

EVENT LOOP OCH PROMISES12 / 28

Övning

Vad loggas?

Öppna 2-event-loop/js/main.js. Fem korta uppgifter med setTimeout, Promise.resolve().then och console.log. Skriv ner din gissning för varje, avkommentera en i taget och kör.

Tid

10 min

Mål

Du kan förutse i vilken ordning synkron kod, promises och timers körs, och förklara varför.

EVENT LOOP OCH PROMISES13 / 28
”

Blockera aldrig call stacken. Så länge din kod kör kan webbläsaren varken rita om sidan eller svara på ett klick.

03

Callbacks

Det äldsta sättet att säga: gör det här när du är klar.

CALLBACKS


Ni har skrivit dem hela tiden

En callback är en funktion du skickar in, som någon annan anropar senare.

Events

button.addEventListener('click',
  () => console.log('Klick!'),
);

Timers

setTimeout(
  () => console.log('Klart'),
  1000,
);

Arraymetoder

Synkron, men samma idé.

items.map(
  (item) => item.name,
);
EVENT LOOP OCH PROMISES16 / 28

CALLBACKS


Steg som väntar på varandra

Koka kaffe

step('Kokar vatten', 1000, () => {
  step('Maler bönor', 500, () => {
    step('Bryggt klart', 1500, () => {
      console.log('Kaffet är klart');
    });
  });
});

Callback hell

Varje nytt steg hamnar ett snäpp längre in. Kan ett steg misslyckas måste varje callback kolla felet själv. Det finns inget gemensamt ställe att fånga dem på.

EVENT LOOP OCH PROMISES17 / 28
04

Promises

Ett löfte om ett värde som kommer senare.

Promise

Ett objekt som står för ett värde som inte finns än. Det kommer senare, eller så blir det ett fel.

  • fetch, response.json() och alla async-funktioner returnerar en promise.
  • I stället för att skicka in en callback får du tillbaka ett objekt, som du kan hänga på then och catch.
EVENT LOOP OCH PROMISES19 / 28

PROMISES


Tre lägen

pendingväntarfulfilledresolve(värde) → thenrejectedreject(fel) → catchEtt läge, en gång.Klar är klar.laddarlyckatfel
EVENT LOOP OCH PROMISES20 / 28

PROMISES


Skapa en promise

Krona eller klave

const flipCoin = () =>
  new Promise((resolve, reject) => {
    setTimeout(() => {
      if (Math.random() < 0.5) {
        resolve('Krona');
      } else {
        reject(new Error('Klave'));
      }
    }, 1000);
  });

wait

Oftast skapar du inte promises själv. fetch gör det åt dig. Men att skriva en gör det lättare att förstå vad som händer.

const wait = (ms) =>
  new Promise((resolve) =>
    setTimeout(resolve, ms),
  );
EVENT LOOP OCH PROMISES21 / 28

PROMISES


then, catch och finally

Koden

flipCoin()
  .then((result) => console.log(result))
  .catch((error) => console.log(error.message))
  .finally(() => console.log('Landat'));

Vad gör de?

then: körs när promisen blev fulfilled. catch: körs om den blev rejected, eller om något kastade ett fel tidigare i kedjan. finally: körs alltid. Bra för att dölja en laddar-text.

EVENT LOOP OCH PROMISES22 / 28

PROMISES


Kaffet som en kedja

Varje then returnerar en ny promise. Stegen står under varandra i stället för i varandra.

Med callbacks

step('Kokar vatten', 1000, () => {
  step('Maler bönor', 500, () => {
    step('Bryggt klart', 1500, () => {
      console.log('Klart');
    });
  });
});

Med promises

wait(1000)
  .then(() => wait(500))
  .then(() => wait(1500))
  .then(() => console.log('Klart'))
  .catch((error) => console.error(error));
EVENT LOOP OCH PROMISES23 / 28

PROMISES


fetch innan await fanns

Med then

fetch(url)
  .then((response) => response.json())
  .then((user) => console.log(user.name))
  .catch((error) => console.error(error));

Med await, som ni kan

const response = await fetch(url);
const user = await response.json();
console.log(user.name);
EVENT LOOP OCH PROMISES24 / 28

Övning

Från callbacks till promises

Gör del 4 i code-alongen: krona eller klave med then, catch och finally, en egen wait(ms), kaffet som en kedja och till sist fetch med then mot https://jsonplaceholder.typicode.com/users/1.

Tid

15 min

Mål

Du kan skapa en promise, ta emot värdet med then och catch, och kedja flera steg.

EVENT LOOP OCH PROMISES25 / 28
”

async och await är promises med en snyggare syntax. Det tar vi i morgon.

05

Efter passet

EFTER PASSET


Titta och öva

  • Video: JavaScript Visualized: Event Loop, Web APIs, (Micro)task Queue, Lydia Hallie. En animation av allt vi ritade idag.
  • Fördjupning: What the heck is the event loop anyway?, Philip Roberts, JSConf EU. Klassikern.
  • Gör klart del 4 i code-alongen om du inte hann.
  • I morgon: async, await och felhantering. På torsdag bygger vi en väderapp med allt.
EVENT LOOP OCH PROMISES28 / 28