从 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 仍然有用。