从 GitHub 获取用户
创建一个异步函数 getUsers(names)
,它获取一个 GitHub 登录名数组,从 GitHub 获取用户并返回一个 GitHub 用户数组。
给定 USERNAME
的用户信息的 GitHub URL 为: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
上,这样当我们获得响应时,它不会等待其他 fetch,而是立即开始读取 .json()
。
如果我们使用 await Promise.all(names.map(name => fetch(...)))
,并在结果上调用 .json()
,那么它将等待所有 fetch 响应。通过将 .json()
直接添加到每个 fetch
中,我们确保单个 fetch 开始以 JSON 格式读取数据,而无需相互等待。
这是一个例子,说明即使我们主要使用 async/await
,低级 Promise API 仍然有用。