返回课程

从 GitHub 获取用户

创建一个异步函数 getUsers(names),它获取一个 GitHub 登录名数组,从 GitHub 获取用户并返回一个 GitHub 用户数组。

给定 USERNAME 的用户信息的 GitHub URL 为: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 上,这样当我们获得响应时,它不会等待其他 fetch,而是立即开始读取 .json()

如果我们使用 await Promise.all(names.map(name => fetch(...))),并在结果上调用 .json(),那么它将等待所有 fetch 响应。通过将 .json() 直接添加到每个 fetch 中,我们确保单个 fetch 开始以 JSON 格式读取数据,而无需相互等待。

这是一个例子,说明即使我们主要使用 async/await,低级 Promise API 仍然有用。

在沙盒中打开带有测试的解决方案。