أعد كتابة "rethrow" مع غير متزامن / انتظار
Below you can find the “rethrow” example. Rewrite it using async/await
instead of .then/catch
.
وتخلص من العودية لصالح حلقة في demoGithubUser
: مع` غير متزامن / انتظار 'يصبح من السهل القيام به.
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); } }); } // Ask for a user name until github returns a valid user function demoGithubUser() { let name = prompt('Enter a name?', 'iliakan'); return loadJson(`https://api.github.com/users/${name}`) .then((user) => { alert(`Full name: ${user.name}.`); return user; }) .catch((err) => { if (err instanceof HttpError && err.response.status == 404) { alert('No such user, please reenter.'); return demoGithubUser(); } else { throw err; } }); } demoGithubUser();
There are no tricks here. Just replace .catch
with try..catch
inside demoGithubUser
and add async/await
where needed:
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); } } // Ask for a user name until github returns a valid user async function demoGithubUser() { let user; while (true) { let name = prompt('Enter a name?', 'iliakan'); try { user = await loadJson(`https://api.github.com/users/${name}`); break; // no error, exit loop } catch (err) { if (err instanceof HttpError && err.response.status == 404) { // loop continues after the alert alert('No such user, please reenter.'); } else { // unknown error, rethrow throw err; } } } alert(`Full name: ${user.name}.`); return user; } demoGithubUser();