Github からユーザをフェッチする
Github のログイン(ユーザ名)の配列を取得し、Github からユーザをフェッチし、Github ユーザの配列を返す非同期関数 getUsers(names)
を作成してください。
指定された USERNAME
に対するユーザ情報の Github url は https://api.github.com/users/USERNAME
です。
サンドボックスにテスト例があります。
重要な点:
- ユーザ毎に1つの
fetch
リクエストがあるはずです。また、リクエストはお互い待つ必要はありません。データはなるべく早く取得できるようにしてください。 - リクエストが失敗した場合、またはそのようなユーザがいない場合は、関数は結果の配列で
null
を返します。
ユーザをフェッチするには次が必要です:
fetch('https://api.github.com/users/USERNAME')
.- レスポンスのステータスが
200
であれば、JS オブジェクトを読むため.json()
を呼び出します。
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
に直接追加することで、個々のフェッチがお互いを待たずにデータをJSONとして読み始めることを保証します。
これは、たとえ私たちが主に async/await
を使っていても、低レベルの Promise
APIがいかに有用であるかの例です。