Size: a a a

Angular - русскоговорящее сообщество

2021 February 18

МБ

Мартин Бах in Angular - русскоговорящее сообщество
Oleg Safonov
Крайний вариант- делать на клиенте, как раз)

Нужно наверное свой оператор написать для pipe, но может быть сложно достаточно
Эх, ну окей) спасибо тогда!
источник

YS

Yura Shtyba in Angular - русскоговорящее сообщество
Мартин Бах
Всем привет!
Есть проблемка...
Обращаюсь к api, в ответе получаю json, если в ответе есть свойство next ( в нем url для запроса следующих данных для пагинации ),
тогда мне надо взять данные с ответа, и перейти по url в next, и забрать данные там, до тех пор пока next не будет null.

Как это сделать? Написал рекурсию для этого, но должно быть более "шикарное" решение. Может быть как то через .pipe() ?
рекурсия наверное в любом случае будет
источник

YS

Yura Shtyba in Angular - русскоговорящее сообщество
в rxjs это как-то так будет выглядеть
источник

МБ

Мартин Бах in Angular - русскоговорящее сообщество
Yura Shtyba
рекурсия наверное в любом случае будет
Я просто думал вдруг есть встроенный pipe, что то типо concatMap, который это обработает красиво)
источник

YS

Yura Shtyba in Angular - русскоговорящее сообщество
ну только вместо эмпти вы возвращаете данные
источник

МБ

Мартин Бах in Angular - русскоговорящее сообщество
Yura Shtyba
в rxjs это как-то так будет выглядеть
как выглядит то?)
источник

YS

Yura Shtyba in Angular - русскоговорящее сообщество
ну как я выше скинул
источник

YS

Yura Shtyba in Angular - русскоговорящее сообщество
только я там опечатался
источник

МБ

Мартин Бах in Angular - русскоговорящее сообщество
я вот так делал

downloadOffers( id: number, page: number | string = null): void {
   this.clientsService.getOffers( {client: id, page}).subscribe(req => {
     if (req.next) {
       const getParams = new URLSearchParams(req.next.split('?')[1]);
       const pages = Number(getParams.get('page'));
       this.offers = this.offers.concat(req.results);
       this.downloadOffers( id, pages );
     } else {
       this.offers = this.offers.concat(req.results);
     }
   });
 }


но тут явно проблема))
источник

МБ

Мартин Бах in Angular - русскоговорящее сообщество
Yura Shtyba
ну как я выше скинул
эмм, можешь линкануть? я не вижу чет
источник

YS

Yura Shtyba in Angular - русскоговорящее сообщество
Мартин Бах
эмм, можешь линкануть? я не вижу чет
минуту, ща я в студии лучше напишу
источник

МБ

Мартин Бах in Angular - русскоговорящее сообщество
Yura Shtyba
минуту, ща я в студии лучше напишу
оке)
источник

YS

Yura Shtyba in Angular - русскоговорящее сообщество
private data: any[] = [];

 public method(url: string): Observable<any> {
   return this.check(url).pipe(
     map(() => this.data),
     tap(() => this.data = [])
   );
 }

 private check(url: string): Observable<{ next: string, data: any }> {
   return this.http.get<{ next: string, data: any }>(url).pipe(
     tap(x => this.data.push(x.data)),
     switchMap(x => {
       if (x.next) {
         return this.check(x.next);
       }
       return of(null);
     })
   );
 }
источник

YS

Yura Shtyba in Angular - русскоговорящее сообщество
ну выглядит в итоге так себе)
источник

МБ

Мартин Бах in Angular - русскоговорящее сообщество
Yura Shtyba
private data: any[] = [];

 public method(url: string): Observable<any> {
   return this.check(url).pipe(
     map(() => this.data),
     tap(() => this.data = [])
   );
 }

 private check(url: string): Observable<{ next: string, data: any }> {
   return this.http.get<{ next: string, data: any }>(url).pipe(
     tap(x => this.data.push(x.data)),
     switchMap(x => {
       if (x.next) {
         return this.check(x.next);
       }
       return of(null);
     })
   );
 }
окей) спасибо)
источник

АЖ

Антон Желтов... in Angular - русскоговорящее сообщество
Yura Shtyba
private data: any[] = [];

 public method(url: string): Observable<any> {
   return this.check(url).pipe(
     map(() => this.data),
     tap(() => this.data = [])
   );
 }

 private check(url: string): Observable<{ next: string, data: any }> {
   return this.http.get<{ next: string, data: any }>(url).pipe(
     tap(x => this.data.push(x.data)),
     switchMap(x => {
       if (x.next) {
         return this.check(x.next);
       }
       return of(null);
     })
   );
 }
это работающий вариант?
источник

YS

Yura Shtyba in Angular - русскоговорящее сообщество
хз)
источник

YS

Yura Shtyba in Angular - русскоговорящее сообщество
Антон Желтов
это работающий вариант?
надо затестить)
источник

АЖ

Антон Желтов... in Angular - русскоговорящее сообщество
у меня очень большие сомнения
источник

YS

Yura Shtyba in Angular - русскоговорящее сообщество
Антон Желтов
у меня очень большие сомнения
возможно, а где вы видите проблему?
источник