zpět k lekci

Stáhněte uživatele z GitHubu

Vytvořte asynchronní funkci vraťUživatele(jména), která obdrží pole uživatelských jmen na GitHubu, stáhne z GitHubu příslušné uživatele a vrátí je jako pole.

URL GitHubu s informacemi o uživateli s uživatelským jménem USERNAME je: https://api.github.com/users/USERNAME.

V pískovišti najdete testovací příklad.

Důležité detaily:

  1. Pro každého uživatele by se měl volat jeden požadavek fetch.
  2. Požadavky by na sebe neměly navzájem čekat. Data tedy dorazí tak rychle, jak je to možné.
  3. Jestliže některý požadavek selže nebo zadaný uživatel neexistuje, funkce by ve výsledném poli měla vrátit null.

Otevřít pískoviště s testy.

Pro stažení uživatele potřebujeme: fetch('https://api.github.com/users/USERNAME').

Jestliže odpověď má status 200, zavoláme .json(), abychom načetli JS objekt.

V opačném případě, jestliže fetch selže nebo odpověď má jiný status než 200, jen vrátíme ve výsledném poli null.

Zde je tedy kód:

async function vraťUživatele(jména) {
  let uživatelé = [];

  for(let jméno of jména) {
    let uživatel = fetch(`https://api.github.com/users/${jméno}`).then(
      úspěšnáOdpověď => {
        if (úspěšnáOdpověď.status != 200) {
          return null;
        } else {
          return úspěšnáOdpověď.json();
        }
      },
      neúspěšnáOdpověď => {
        return null;
      }
    );
    uživatelé.push(uživatel);
  }

  let výsledky = await Promise.all(uživatelé);

  return výsledky;
}

Prosíme všimněte si, že volání .then je připojeno přímo k fetch. Když tedy máme odpověď, nečeká na ostatní stahování, ale začne okamžitě načítat .json().

Kdybychom použili await Promise.all(jména.map(jméno => fetch(...))) a volali .json() na výsledcích, napřed by se čekalo na odpovědi všech stahování. Přidáním .json() přímo ke každému fetch zajistíme, že jednotlivá stahování začnou načítat data jako JSON bez čekání na ostatní stahování.

Je to příklad toho, jak může být příslibové API nižší úrovně stále užitečné, i když převážně používáme async/await.

Otevřít řešení s testy na pískovišti.