从 GitHub fetch 用户信息
创建一个异步函数 getUsers(names),该函数接受 GitHub 登录名数组作为输入,查询 GitHub 以获取有关这些用户的信息,并返回 GitHub 用户数组。
带有给定 USERNAME 的用户信息的 GitHub 网址是: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(...))),并在 results 上调用 .json() 方法,那么它将会等到所有 fetch 都获取到响应数据才开始解析。通过将 .json() 直接添加到每个 fetch 中,我们就能确保每个 fetch 在收到响应时都会立即开始以 JSON 格式读取数据,而不会彼此等待。
这个例子表明,即使我们主要使用 async/await,低级别的 Promise API 仍然很有用。