Как правильно использовать вывод одной наблюдаемой в качестве входной для другой в угловых - PullRequest
0 голосов
/ 09 октября 2019

Мне нужно вызвать службу с асинхронным (http) возвратом и использовать ее вывод в качестве дополнительного входа к методу службы (который возвращает наблюдаемое). Какой лучший способ сделать это в Angular 4 +?

Я пытался «связать» результаты в методе «подписка» первого сервиса, но при этом мой сервис всегда возвращает «ноль».

public secondServiceCall: Observable<object> {
   this.firstService.next().subscribe(result=> {
      item.number = result;

      return this.httpService.post<object>('/new', item);
   });
}

Я ожидал, что функция не вернется, пока не будет завершена подписка на firstService (асинхронно), но этого не произошло - и вместо этого я получил 'null' в своей вызывающей функции.

Я также пытался использовать вызов firstService в качестве наблюдаемой - она ​​правильно возвращает вторую наблюдаемую, но никогда не ждет выполнения функции then для запуска второй наблюдаемой.

this.firstService.next().toPromise().then(result=> {
  item.number = result;
});

return return this.httpService.post<object>('/new', item);

Ответы [ 2 ]

3 голосов
/ 09 октября 2019

Импорт оператора switchMap:

import { switchMap } from 'rxjs/operators';

Каким бы ни был метод в firstService, который возвращает наблюдаемое из item, оберните его так:

public secondServiceCall: Observable<object> {
   return this.firstService.someMethod().pipe(
      switchMap(item => {
         return this.httpService.post<object>('/new', item);
      })
   ) // result of your HTTP call based on item from firstService is now available when you subscribe
}

Чтоон выполняет любой ваш метод firstService, который возвращает Observable<item>, затем переключает на вызов httpService.post, который в качестве первого аргумента предоставляет результат метода firstService.

Редактировать: Спасибо, JB Nizet, объединил несколько итераций ответа: /

2 голосов
/ 09 октября 2019

В вашем случае не важно, какой оператор объединения использовать: flatMap, concatMap или switchMap;они будут вести себя одинаково, потому что Angular http выдает значение только один раз и сразу же завершается.

Обычно вы предпочитаете concatMap больше, потому что этот оператор учитывает порядок выбросов (это означает, чтоесли у вас есть некоторые отложенные вызовы в ваших Наблюдаемых, они будут выполняться один за другим, в то время как flatMap и switchMap могут привести к неопределенным результатам, подробности здесь https://www.baeldung.com/rxjava-flatmap-switchmap).


TLDR; Использование concatMap

this.http.get('one').pipe(
  concatMap(result => this.http.get('two'))
)
...