Сравните значения из двух Observable и верните Observable - PullRequest
1 голос
/ 20 июня 2020

Я проверяю условие и получаю Observable<boolean>:

let result = this.service.getCity().pipe(
  map((city: string) => city && city.toLowerCase() === ???) 
);

Мне нужно проверить, равно ли city:

this.authenticationService.getCity():

Этот метод также возвращает и Observable<boolean>.

Как я могу объединить две наблюдаемые и использовать оба значения в условии?

Мне нужно вернуть Observable в конце.

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Альтернатива forkjoin

Если наблюдаемый completion не является триггером для сравнения обоих наблюдаемых, вы можете использовать switchMap

const { from, of } = rxjs;
const { map, switchMap, tap, take } = rxjs.operators;

const serviceCity$ = () => from(['Berlin', 'London', 'Paris']);
const authentificationCity$ = () => of('london');

const result$ = serviceCity$().pipe(
  map(city => city && city.toLowerCase()),
  switchMap(city => authentificationCity$().pipe(
    map(authCity => city === authCity),
    take(1),
  ))
);

result$.subscribe(v => console.log('authentification city equals london: ', v));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.3/rxjs.umd.min.js"></script>

Информация

  • serviceCity$ и authentificationCity$ равны вашим service.getCity() и this.authenticationService.getCity()
  • Я предполагал, что обе функции возвращают string, и вы хотите сравнить обе strings. Если вы хотите сравнить два значения pre-mapped, объясните мне, и я обновлю код.
  • result$ будет срабатывать всякий раз, когда serviceCity$ испускает, за которым следует authentificationCity$
  • take(1) предотвращает запуск result$ с помощью authentificationCity$ вместо serviceCity$
1 голос
/ 20 июня 2020

Предполагая, что this.service.getCity() и this.authenticationService.getCity() возвращает единственный объект / строку в зависимости от того, как вы его назвали.

Вы можете использовать оператор forkJoin. Вот пример

const source1 = of("CityName");
const source2 = of("CityName");

forkJoin({
  source1,
  source2
}).pipe(
  map((x: {source1, source2}) => x.source1 === x.source2)
).subscribe(result => console.log(result));

StackBlitz: https://stackblitz.com/edit/rxjs-luncbd

...