レッスンに戻る

GitHub からユーザーをフェッチ

GitHubログインの配列を取得し、GitHubからユーザーを取得してGitHubユーザーの配列を返す非同期関数getUsers(names)を作成します。

指定されたUSERNAMEのユーザー情報を含むGitHub URLは次のとおりです:https://api.github.com/users/USERNAME.

サンドボックスにはテスト例があります。

重要な詳細

  1. ユーザーごとに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に直接追加することで、個々のフェッチが互いに待つことなくJSONとしてデータの読み取りを開始することが保証されます。

これは、主にasync/awaitを使用する場合でも、低レベルのPromise APIが依然として有用であることの例です。

サンドボックスでテストを実行し、解決策を開きます。