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

Отримати користувачів з GitHub

Створіть асинхронну функцію getUsers(names), яка приймає масив логінів користувачів GitHub, завантажує дані з GitHub та повертає масив об’єктів користувачів GitHub з інформацією про них.

Ось тут можна завантажити дані про користувача Github з усією інформацією за заданим USERNAME: https://api.github.com/users/USERNAME.

У пісочниці є приклад тесту.

Важливі нюанси:

  1. Для кожного користувача повинен бути зроблений один запит fetch.
  2. Запити не повинні чекати один одного. Це дозволяє даним надходити якнайшвидше.
  3. Якщо будь-який запит не вдасться або користувач не існує, функція повинна повернути null у вихідному масиві.

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

Щоб отримати інформацію про користувачів, нам потрібно викликати : 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.

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