Skip to content

12. JavaScript async/await

This content is not available in your language yet.

JavaScript async/await

JavaScript jest jednowątkowy — nie może czekać na odpowiedź serwera blokując wszystko. Promise reprezentuje wartość, która będzie dostępna w przyszłości. async/await to cukier syntaktyczny nad Promise — pozwala pisać asynchroniczny kod jakby był synchroniczny.

  1. Dlaczego JS jest asynchroniczny? — Jednowątkowy, musi obsługiwać I/O bez blokowania
  2. Co to jest Promise? — Obiekt reprezentujący przyszłą wartość: pending → fulfilled/rejected
  3. Jak działa async/await?async tworzy funkcję zwracającą Promise, await czeka na wynik
  4. Jak obsługiwać błędy?try/catch z await lub .catch() na Promise
  1. Callback hell — dlaczego potrzebowaliśmy lepszego rozwiązania
  2. Promise — stany — pending, fulfilled, rejected
  3. then/catch/finally — łańcuchowanie
  4. async/await — składnia, await w pętli
  5. Promise.all i Promise.race — równoległe operacje

Schemat

Oś czasu: Synchroniczny kod → wywołanie async → Call Stack pusty → callback queue → Event Loop → wynik. Pokaż jak JS “nie blokuje” podczas czekania.

Przykład kodu JSX

Porównanie: callback hell (5 poziomów zagnieżdżenia) → Promise chain → async/await (czytelny jak synchroniczny kod).

  • Dlaczego asynchroniczność w JS
  • Promise: pending/fulfilled/rejected
  • Podstawy async/await z try/catch

Forma: 10 slajdów, 10 minut

Ocena: 3.0

Przykład 1 — Ewolucja: callback → Promise → async/await

Dział zatytułowany „Przykład 1 — Ewolucja: callback → Promise → async/await”
// 1. CALLBACK HELL (stary sposób)
getUser(userId, (user) => {
getPosts(user.id, (posts) => {
getComments(posts[0].id, (comments) => {
// 3 poziomy zagnieżdżenia... a to dopiero początek!
console.log(comments);
});
});
});
// 2. PROMISE CHAIN (lepiej)
getUser(userId)
.then(user => getPosts(user.id))
.then(posts => getComments(posts[0].id))
.then(comments => console.log(comments))
.catch(err => console.error(err));
// 3. ASYNC/AWAIT (najczytelniej)
async function loadData() {
try {
const user = await getUser(userId);
const posts = await getPosts(user.id);
const comments = await getComments(posts[0].id);
console.log(comments);
} catch (err) {
console.error(err);
}
}
// Sekwencyjnie — wolno! (czekamy na każde po kolei)
const user = await getUser(id); // 200ms
const posts = await getPosts(id); // 200ms
// Łącznie: 400ms
// Równolegle — szybko!
const [user, posts] = await Promise.all([
getUser(id), // oba startują jednocześnie
getPosts(id), //
]);
// Łącznie: ~200ms (tyle ile dłuższe z dwóch)

Pokaż callback hell wizualnie

Slajd z callback hell to piramida — kod idzie w prawo coraz bardziej. Kontrastujcie z płaskim kodem async/await. Różnica jest natychmiast widoczna.

JS Visualizer tool

Użyjcie narzędzia jsvisualizer.app do animowanej demonstracji Event Loop — klasa zobaczy jak Call Stack, Task Queue i Web APIs współpracują.

Asynchroniczność to serce nowoczesnego JS!

Bez async/await nie da się pisać aplikacji React. Ten temat jest absolutną podstawą — opanujcie go a wszystko inne stanie się łatwiejsze!