بازگشت به درس

بازنویسی "rethrow" با async/await

در زیر ما مثالی از “rethrow” پیدا می کنیم. آن را با استفاده از ‍async/await بجای then/catch. بازنویسی کنید.

و از حالت بازگشتی در demoGithubUser خلاص شوید: با استفاده از async/await بسیار آسان می شود.

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);
      }
    });
}

// نام کاربری را می پرسد تا زمانی که گیت هاب یک کاربر معتبر برگرداند
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();

ترفند خاصی وجود ندارد. فقط catch. را با try..catch در داخل demoGithubUser جایگزین کنید و async/await را در جایی که نیاز است اضافه کنید:

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);
  }
}

// نام کاربری را می پرسد تا زمانی که گیت هاب یک کاربر معتبر برگرداند
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; // خطایی رخ نداده است، از حلقه خارج می شود
    } catch(err) {
      if (err instanceof HttpError && err.response.status == 404) {
        // حلقه بعد از alert ادامه می یابد
        alert("No such user, please reenter.");
      } else {
        // خطای ناشناخته، مجدد throw می شود
        throw err;
      }
    }
  }


  alert(`Full name: ${user.name}.`);
  return user;
}

demoGithubUser();