Promisy v synchronním stylu v JavaScriptu
Pro řešení problému promise hell byl vymyšlen speciální syntax pro promisy, umožňující psát asynchronní kód mnohem jednodušeji - v synchronním stylu.
Pojďme se jej naučit. Nejprve si vezmeme kód z předchozí lekce:
javascriptfunction func() {
getSmth(2).then(res => {
console.log(res); // vypíše 4
});
}
func();
Kdyby naše funkce getSmth byla
synchronní, pak bychom kód funkce func
mohli přepsat následovně:
javascriptfunction func() {
let res = getSmth(2);
console.log(res); // vypíše 4
}
Funkce getSmth je však asynchronní,
proto výše uvedený kód nebude fungovat.
Ale pomocí synchronního stylu promisů
můžeme dosáhnout něčeho podobného. Pojďme na to.
Nejprve musíme deklarovat naši funkci
func jako asynchronní pomocí speciálního
příkazu async:
javascriptasync function func() {
}
Poté budeme uvnitř funkce func
moci používat speciální příkaz await.
Tento příkaz, napsaný před promisem, donutí
JavaScript čekat, dokud promisa
nedokončí svůj běh. Poté příkaz vrátí
výsledek promisy a provádění kódu bude pokračovat.
V našem případě musíme napsat await
před volání getSmth. Protože výsledkem
volání této funkce bude promisa, další
provádění kódu bude pokračovat pouze po
dokončení této promisy. No, a výsledek
promisy lze zapsat do proměnné. Proveďme
popsané:
javascriptasync function func() {
let res = await getSmth(2);
console.log(res); // vypíše 4
}
func();
Pojďme zavolat getSmth několikrát:
javascriptasync function func() {
let res1 = await getSmth(2);
let res2 = await getSmth(3);
console.log(res1 + res2); // vypíše 13
}
func();
A nyní budeme volat getSmth v cyklu:
javascriptasync function func() {
let arr = [1, 2, 3, 4, 5];
let sum = 0;
for (let elem of arr) {
sum += await getSmth(elem);
}
console.log(sum);
}
func();
Přepište následující kód pomocí synchronní syntaxe:
javascriptfunction func() {
getSmth(2).then(res1 => {
getSmth(3).then(res2 => {
getSmth(4).then(res3 => {
console.log(res1 + res2 + res3);
});
});
});
}
func();