Зависимые наблюдаемые в RxJs - PullRequest
0 голосов
/ 21 января 2019

Что такое «лучшие практики» для объединения последовательности вызовов HttpClient (предположим, что текущий вызов зависит от результатов предыдущих вызовов)?Следующее решение является функциональным, но, видимо, не рекомендуется.Каждый get возвращает Observable.Использование оператора "pipe" предпочтительнее в решении (более новый подход в RxJs).

ngOnInit() {
  this.firstService.get().subscribe((first) => {
    this.secondService.get().subscribe(second => {
      this.thirdService.get().subscribe(third => {
        ... possibly more nested calls ...
      })
    })
  })
}

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Если причиной, по которой вам нужны вложенные вызовы, является использование данных из предыдущих вызовов, я рекомендую использовать оператор канала с mergeMaps и другими каналами / картами для возврата следующих вызовов вместо предыдущих.

Должно быть что-то похожее (подписки и отписки пропущены):

this.firstService.pipe(
    mergeMap(res =>
        this.secondService.get().pipe(
            map(data => data),
        ),
    ... <more as needed>
);

Если их не нужно вкладывать, проще сделать this.service.get().toPromise() внутри обещания.

0 голосов
/ 21 января 2019

Ваш код намного превосходит лучшие практики. Никогда не делайте подписку внутри другого.

Если ваши задачи представляют собой три отдельные задачи / наблюдаемые, которые не зависят друг от друга, тогда рассмотрите возможность использования forkJoin (все наблюдаемые начинаются одновременно, и когда заканчивается последняя наблюдаемая, возвращает результат)

let observable1(param1);
let observable2(param2);
let observable3(param3);

let joinedObservables = forkJoin(observable1, observable2, observable3).subscribe(x => {
  let result1 = x[0];
  let result2 = x[1];
  let result3 = x[2];

  ...
});

Если их результаты зависят друг от друга, вы можете использовать switchMap, flatMap, mergeMap, exhaustMap (проверить различия)

let resultObservable =  return this.observable1().pipe(mergeMap((param1) => {
  return this.observable2().pipe(map((param1) => {

    ....        

    return <result>;
  }));
}));

resultObservable.subscribe(x => {
   ...
});
...