【发布时间】:2021-10-17 14:52:00
【问题描述】:
如果您向https://api.github.com/users/benawad/repos 发出GET 请求,您将获得用户benawad 拥有的所有存储库。至少这就是 API 端点预期返回的内容。问题是 GitHub 将存储库的数量限制为 30 个。
截至今天(2021 年 8 月 14 日),用户 benawad 拥有 246 个存储库。
要克服上述问题,您应该发出一个 GET 请求,但需要添加一些额外的参数...... GitHub 已经对其 API 实现了分页。因此,您应该在 URL 中指定要检索的页面和每页的存储库数量。
我们的新GET 请求应如下所示:
https://api.github.com/users/benawad/repos?page=1&per_page=1000
问题在于 GitHub 将每页的存储库数量限制为 100 个。因此我们的 GET 请求返回 100 个存储库,而不是用户 benawad 当前拥有的 246 个存储库。
在我的 Angular 服务中,我实现了以下代码来从所有页面中检索所有 repos。
public getUserRepos(user: string): Observable<RepositoryI[]> {
return new Observable((subscriber: Subscriber<RepositoryI[]>) => {
this.getUserData(user).subscribe((data: UserI) => {
//public_repos is the amt of repos the user has
const pages: number = Math.ceil(data.public_repos / 100);
for (let i = 1; i <= pages; i++) {
this.http
.get(
`https://api.github.com/users/${user}/repos?page=${i}&per_page=100`
)
.subscribe((data: RepositoryI[]) => {
subscriber.next(data);
});
}
});
});
}
在我的组件中,我订阅了以下内容:
this.userService.getUserRepos(id).subscribe((repos)=>{
this.repositories.push(...repos);
})
这个方法的问题是我无法控制 Observable 何时停止发出值。在我的组件中,我想在 Observable 完成时触发一个函数。
我尝试了以下方法:
public getUserRepos(user: string): Observable<RepositoryI[]> {
return new Observable((subscriber: Subscriber<RepositoryI[]>) => {
this.getUserData(user).subscribe((data: UserI) => {
const pages: number = Math.ceil(data.public_repos / 100);
for (let i = 1; i <= pages; i++) {
this.http
.get(
`https://api.github.com/users/${user}/repos?page=${i}&per_page=100`
)
.subscribe((data: RepositoryI[]) => {
subscriber.next(data);
// If the for loop is complete -> complete the subscriber
if(pages == i) subscriber.complete();
});
}
});
});
}
在我的组件中,我执行以下操作:
this.userService.getUserRepos(id).subscribe(
(repos) => {
this.repositories.push(...repos);
},
(err) => {
console.log(err);
},
() => {
// When the observable is complete:
console.log(this.repositories); // This only logs 46 repositores, it should log 246
// I want to trigger some function here
}
);
console.log() 仅记录 46 个存储库。为什么会这样?也许我在获取所有 3 个页面之前完成了订阅者;但我在订阅中调用.complete()。我究竟做错了什么?提前致谢。
【问题讨论】:
标签: angular typescript rxjs github-api