Qayta yozing "rethrow" async/await
Quyida Va'dalar zanjiri bobidagi “rethrow” misolini topishingiz mumkin. Uni .then/catch
o’rniga async/await
yordamida qayta yozing.
Va demoGithubUser
dagi tsikl foydasiga rekursiyadan xalos bo’ling: async/await
yordamida bajarish oson bo’ladi.
class HttpError extends Error {
constructor(response) {
super(`${response.status} for ${response.url}`);
this.name = "HttpError";
this.response = response;
}
}
function loadJson(url) {
return fetch(url).then((response) => {
if (response.status == 200) {
return response.json();
} else {
throw new HttpError(response);
}
});
}
// Github haqiqiy foydalanuvchini ismini qaytarguncha foydalanuvchi ismini so'rang
function demoGithubUser() {
let name = prompt("Ism kiriting", "iliakan");
return loadJson(`https://api.github.com/users/${name}`)
.then((user) => {
alert(`To'liq ism: ${user.name}.`);
return user;
})
.catch((err) => {
if (err instanceof HttpError && err.response.status == 404) {
alert("Bunday foydalanuvchi yo'q, iltimos qayta kiring.");
return demoGithubUser();
} else {
throw err;
}
});
}
demoGithubUser();
Bu yerda hech qanday fokuslar yo’q. demoGithubUser
ichida .catch
ni try...catch
bilan almashtiring va kerak bo’lganda async/await
ni qo’shing:
class HttpError extends Error {
constructor(response) {
super(`${response.status} for ${response.url}`);
this.name = "HttpError";
this.response = response;
}
}
async function loadJson(url) {
let response = await fetch(url);
if (response.status == 200) {
return response.json();
} else {
throw new HttpError(response);
}
}
// Github haqiqiy foydalanuvchini qaytarguncha foydalanuvchi nomini so'rang
async function demoGithubUser() {
let user;
while (true) {
let name = prompt("Ism kiriting", "iliakan");
try {
user = await loadJson(`https://api.github.com/users/${name}`);
break; // xato yo'q, tsiklni tark etish
} catch (err) {
if (err instanceof HttpError && err.response.status == 404) {
// alert-dan keyin tsikl davom etadi
alert("Bunday foydalanuvchi yo'q, iltimos qayta kiring.");
} else {
// noma'lum xato, qaytarmoq
throw err;
}
}
}
alert(`To'liq ism: ${user.name}.`);
return user;
}
demoGithubUser();