Слияние httpClient Observables в один динамически в зависимости от количества страниц - PullRequest
0 голосов
/ 31 мая 2018

У меня есть 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),
    )),
  );
}

и получите только последнюю страницу

1 Ответ

0 голосов
/ 01 июня 2018

Finnaly Я получил:

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() } });
}

Спасибо @ martin и эту статью RxJS: Понимание Развернуть

...