【发布时间】:2020-04-27 23:41:03
【问题描述】:
所以我尝试了很多方法,但没有发现。欢迎大家帮忙;我发现了 Angular 和 RxJs。
我有一项服务可以在 swapi API 的许多 URL 上获取资源。我事先不知道会获取多少页。所以我为每个http.get(url) 使用concat 来创建一个observable。
目前,只有第一页数据被添加到组件中(即firstPage);所有请求都已发送。
export class PeoplesService {
urlSource = "https://swapi.co/api/people/";
pageResponse: GeneralResponse<People>;
fullResponse: Observable<GeneralResponse<People>>;
constructor(private _http:HttpClient) {
}
getPaged(n: number): string {
return this.urlSource + "?page=" + n;
}
fetch(): Observable<GeneralResponse<People>> {
let firstPage = this._http
.get<GeneralResponse<People>>(this.urlSource);
firstPage.subscribe(page => {
this.fullResponse = firstPage; // first page fetched
let pageToDownload = Math.ceil(page.count / page.results.length);
for(let i=2; i<=pageToDownload; i++) {
// Merge all observable (so all request) into one
concat(this.fullResponse,
this._http.get<GeneralResponse<People>>(this.getPaged(i)));
}
});
return this.fullResponse;
}
}
那么我的组件的基本代码如下:
ngOnInit() {
this.peoplesService.fetch().subscribe(r => this.movies = r.results);
// a sort of fetch().onNextFetch(this.movies.push(...r.results)) seems better in this case
// because every data on each pages need to be merged into this.movies
// or sort of fetch().subscribeUntilCompleted(r => this.peoples = r.results) needed I guess
}
我还没有找到可以用来代替订阅的东西(例如 当 Observable 已返回所有内容并收集所有内容时订阅...)。
我猜 subscribe 不会等待 Observable 的“onCompleted”状态,也不会每次都调用它来获取所有返回值。那么如何获取所有数据呢?
有什么东西可以让 Observable 像流一样工作并将其通过管道传送到 this.peoples.push(...r.results) 吗?我不知道我是否走在正确的轨道上。
【问题讨论】:
-
我想你需要的是combineLatest
标签: angular typescript rxjs