Přepište „opětovné vyvolání“ za použití async/await
Následuje příklad „opětovného vyvolání“. Přepište jej za použití async/await místo .then/catch.
A ve funkci demoUživatelGitHubu se zbavte rekurze ve prospěch cyklu: s async/await to bude lehké.
class ChybaHttp extends Error {
constructor(odpověď) {
super(`${odpověď.status} pro ${odpověď.url}`);
this.name = 'ChybaHttp';
this.odpověď = odpověď;
}
}
function načtiJson(url) {
return fetch(url)
.then(odpověď => {
if (odpověď.status == 200) {
return odpověď.json();
} else {
throw new ChybaHttp(odpověď);
}
});
}
// Ptáme se na uživatelské jméno, dokud GitHub nevrátí platného uživatele
function demoUživatelGitHubu() {
let jméno = prompt("Zadejte jméno", "iliakan");
return načtiJson(`https://api.github.com/users/${jméno}`)
.then(uživatel => {
alert(`Celé jméno: ${uživatel.name}.`);
return uživatel;
})
.catch(chyba => {
if (chyba instanceof ChybaHttp && chyba.odpověď.status == 404) {
alert("Takový uživatel neexistuje, prosím zadejte znovu.");
return demoUživatelGitHubu();
} else {
throw chyba;
}
});
}
demoUživatelGitHubu();
Nejsou tady žádné triky. Stačí uvnitř demoUživatelGitHubu nahradit .catch za try..catch a přidat async/await, kde jsou zapotřebí:
class ChybaHttp extends Error {
constructor(odpověď) {
super(`${odpověď.status} pro ${odpověď.url}`);
this.name = 'ChybaHttp';
this.odpověď = odpověď;
}
}
async function načtiJson(url) {
let odpověď = await fetch(url);
if (odpověď.status == 200) {
return odpověď.json();
} else {
throw new ChybaHttp(odpověď);
}
}
// Ptáme se na uživatelské jméno, dokud GitHub nevrátí platného uživatele
async function demoUživatelGitHubu() {
let uživatel;
while(true) {
let jméno = prompt("Zadejte jméno", "iliakan");
try {
uživatel = await načtiJson(`https://api.github.com/users/${jméno}`);
break; // žádná chyba, opustíme cyklus
} catch(chyba) {
if (chyba instanceof ChybaHttp && chyba.odpověď.status == 404) {
// po alertu bude cyklus pokračovat
alert("Takový uživatel neexistuje, prosím zadejte znovu.");
} else {
// neznámá chyba, vyvoláme ji znovu
throw chyba;
}
}
}
alert(`Celé jméno: ${uživatel.name}.`);
return uživatel;
}
demoUživatelGitHubu();