Отримати користувачів з GitHub
Створіть асинхронну функцію getUsers(names)
, яка приймає масив логінів користувачів GitHub, завантажує дані з GitHub та повертає масив об’єктів користувачів GitHub з інформацією про них.
Ось тут можна завантажити дані про користувача Github з усією інформацією за заданим USERNAME
: https://api.github.com/users/USERNAME
.
У пісочниці є приклад тесту.
Важливі нюанси:
- Для кожного користувача повинен бути зроблений один запит
fetch
. - Запити не повинні чекати один одного. Це дозволяє даним надходити якнайшвидше.
- Якщо будь-який запит не вдасться або користувач не існує, функція повинна повернути
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
.