логическое ИЛИ объединяет 2 или более наблюдаемых потока - PullRequest
1 голос
/ 20 октября 2019

У меня есть 2 наблюдаемые, которые указывают, загружают ли они данные или нет. Они приходят из @ ngrx / data.

loadingA$: Observable<boolean>
loadingB$: Observable<boolean>

Я бы хотел, чтобы "логическое ИЛИ" объединяло эти два, чтобы делать что угодно, когда либо истинно, используя rxjs или более элегантный метод. Может быть ramdajs ?, а может быть комбинированное состояние загрузки? Однако разные компоненты требуют разных комбинаций потоков загрузки.

Кроме того, что, если у меня 20 потоков, это не должно быть ограничено только 2 потоками.

(!) Я не хочуназначить дополнительные локальные переменные.

1 Ответ

1 голос
/ 20 октября 2019
combineLatest(loadingA$, loadingB$).pipe(map((a, b) => a || b));

или

const anyLoading = (...observables: Observable<boolean>[]) => combineLatest(observables).pipe(
  map(bools => bools.some(loading => loading))
);

и используйте его

anyLoading(loadingA$, loadingB$);

const { combineLatest, BehaviorSubject } = rxjs;
const { map } = rxjs.operators;

const anyLoading = (...observables) => combineLatest(observables).pipe(
  map(bools => bools.some(loading => loading))
);

const loadingA$ = new BehaviorSubject(false);
const loadingB$ = new BehaviorSubject(true);

anyLoading(loadingA$, loadingB$).subscribe(loading => { console.log(loading); });

loadingB$.next(false);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.3/rxjs.umd.min.js"></script>
...