назад до уроку

Fetch users from GitHub

Create an async function getUsers(names), that gets an array of GitHub logins, fetches the users from GitHub and returns an array of GitHub users.

The GitHub url with user information for the given USERNAME is: https://api.github.com/users/USERNAME.

There’s a test example in the sandbox.

Important details:

  1. There should be one fetch request per user.
  2. Requests shouldn’t wait for each other. So that the data arrives as soon as possible.
  3. If any request fails, or if there’s no such user, the function should return null in the resulting array.

Відкрити пісочницю з тестами.

Щоб отримати інформацію про користувачів, нам потрібно викликати : fetch('https://api.github.com/users/USERNAME').

Якщо відповідь приходить із статусом 200, то викликаємо метод .json(), щоб прочитати JS-об’єкт.

В іншому випадку, якщо fetch завершується помилкою, або код статусу у відповіді відмінний від 200, то просто повертаємо значення null у масиві результатів.

Ось код:

async function getUsers(names) {
  let jobs = [];

  for(let name of names) {
    let job = fetch(`https://api.github.com/users/${name}`).then(
      successResponse => {
        if (successResponse.status != 200) {
          return null;
        } else {
          return successResponse.json();
        }
      },
      failResponse => {
        return null;
      }
    );
    jobs.push(job);
  }

  let results = await Promise.all(jobs);

  return results;
}

Потрібно звернути увагу на те, що виклик .then прикріплений до fetch, щоб коли відповідь отримана, то одразу починати зчитування даних за допомогою .json() не очікуючи завершення інших запитів.

Якщо, було б використано await Promise.all(names.map(name => fetch(...))) та викликали б .json() на результатах запитів, то треба було б чекати поки закінчилися всі запити. Викликаючи .json() одразу після кожного fetch, ми добились того, що зчитування надісланих по кожному окремому запиту відбуваєся незалежно від інших запитів.

Це приклад того, як відносно низько-рівневе Promise API може бути корисним, навіть якщо ми переважно використовуємо async/await.

Відкрити рішення із тестами в пісочниці.