Несколько RX JS BehaviorSubjects для запуска вызова функции - PullRequest
1 голос
/ 28 мая 2020

Я хочу запустить функцию, требующую интенсивных вычислений, которая зависит от последнего значения 3 объектов behaviorSubject. Иногда все предметы меняются одновременно, и я не хочу проводить расчет 3 раза. Вот как я это реализовал на данный момент.

this.subscription = merge(behaviorSubject1$, behaviorSubject2$, behaviorSubject3$)
        .pipe(throttleTime(300)) //this is to avoid running the function 3 times when all subjects change simultaneously
        .subscribe(() => {
           const answer = getSolution(subject1$.getValue(), subject2$.getValue(), subject3$.getValue());

        });

Я не уверен, что это go лучший способ об этом. Любая помощь приветствуется

Ответы [ 2 ]

1 голос
/ 28 мая 2020

В этом случае лучше использовать commonLatest () вместо merge():

this.subscription = combineLatest([behaviorSubject1$, behaviorSubject2$, behaviorSubject3$])
  .pipe(throttleTime(300))
  .subscribe(([value1, value2, value3]) => {
     const answer = getSolution(value1, value2, value3);
  });
0 голосов
/ 28 мая 2020

Зависит от того, что вы хотите сделать

хотите ли вы рассчитать на основе последнего значения? тогда ваш подход в порядке, но вместо этого используйте combLatest, любое излучение вызовет вычисление.

this.subscription = combineLatest(behaviorSubject1$, behaviorSubject2$, behaviorSubject3$)
        .pipe(throttleTime(300))
        .subscribe(([o1, o2, o3]) => {
          const answer = getSolution(o1, o2, o3);
        });

вы хотите вычислить все из них, кроме одного? используйте concatMap.

this.subscription = combineLatest(behaviorSubject1$, behaviorSubject2$, behaviorSubject3$).pipe(
  concatMap(([o1, o2, o3]) => getSolution(o1, o2, o3)), // getSolution should be an observable.
)
        .subscribe(solution => {
        });

вы хотите игнорировать выбросы во время расчета? используйте выхлопную карту.

this.subscription = combineLatest(behaviorSubject1$, behaviorSubject2$, behaviorSubject3$).pipe(
  exhaustMap(([o1, o2, o3]) => getSolution(o1, o2, o3)), // getSolution should be an observable.
)
        .subscribe(solution => {
        });

вы хотите рассчитать, когда все 3 были изменены? используйте zip.

this.subscription = zip(behaviorSubject1$, behaviorSubject2$, behaviorSubject3$)
        .subscribe(([o1, o2, o3]) => {
           const answer = getSolution(o1, o2, o3);
        });
...