darsga qaytish

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