根据页数动态合并 httpClient Observables
Merging httpClient Observables in one dynamically depending on page count
我有 API 部分(按页)提供数据。我在第一次请求时获得页数。
在客户端,我需要在一个 Observable 中连接页面。尝试这样的事情:
all$: Observable<Service[]>;
iterator$ = new BehaviorSubject(1);
constructor(public http: HttpClient) {
this.all$ = this.iterator$.pipe(
concatMap(page => http.get<Service[]>('/service', {params: {page: page.toString()}}).pipe(
tap(() => (ifNotLastPage) ? this.iterator$.next(++page) : null),
)),
);
}
并且只获取最后一页
最后我得到了:
all$: Observable<Service[]>;
constructor(public http: HttpClient) {
this.all$ = this.getData().pipe(
expand(result => {
const next = getNextPageNumber(result);
return (next) ? this.getData(next) : empty();
}),
map(result => result.body),
concatMap(typeCasting(Service)),
toArray<Service>(),
);
}
getData(page = 1): Observable<HttpResponse<Config>> {
return this.http.get<Config>('/service', { observe: 'response', params: { page: page.toString() } });
}
然后 X 到 @martin
和这篇文章 RxJS: Understanding Expand
我有 API 部分(按页)提供数据。我在第一次请求时获得页数。
在客户端,我需要在一个 Observable 中连接页面。尝试这样的事情:
all$: Observable<Service[]>;
iterator$ = new BehaviorSubject(1);
constructor(public http: HttpClient) {
this.all$ = this.iterator$.pipe(
concatMap(page => http.get<Service[]>('/service', {params: {page: page.toString()}}).pipe(
tap(() => (ifNotLastPage) ? this.iterator$.next(++page) : null),
)),
);
}
并且只获取最后一页
最后我得到了:
all$: Observable<Service[]>;
constructor(public http: HttpClient) {
this.all$ = this.getData().pipe(
expand(result => {
const next = getNextPageNumber(result);
return (next) ? this.getData(next) : empty();
}),
map(result => result.body),
concatMap(typeCasting(Service)),
toArray<Service>(),
);
}
getData(page = 1): Observable<HttpResponse<Config>> {
return this.http.get<Config>('/service', { observe: 'response', params: { page: page.toString() } });
}
然后 X 到 @martin 和这篇文章 RxJS: Understanding Expand