как подписаться на последнюю наблюдаемую и выполнить функцию в rx js? - PullRequest
0 голосов
/ 13 марта 2020

Привет, у меня есть небольшой фрагмент кода в моем проекте.

в основном подписывается на группу форм angular и вызывает метод generatePerformanceGraph, который dr aws svg.

группа форм имеет около 6 элементов управления формой. проблема в том, что когда я изменяю значение элемента управления формы, он устанавливает другие значения для других элементов управления формы. В результате, когда я изменяю какое-то значение элемента управления формы, это вызывает вызванный generatePerformanceGraph несколько раз. Как я могу предотвратить эту проблему.

Короче говоря, в основном я хочу, чтобы при изменении группы форм я хотел подписаться на последнее наблюдаемое, а затем один раз выполнить generatePerformanceGraph.

this.formGroup.valueChanges.subscribe(formValue => {
  if(this.formGroup.valid) {
    this.generatePerformanceGraph(formValue);
  }
});

Я пытался как это не сработало.

this.formGroup.valueChanges.
pipe(
  distinctUntilChanged()
) .subscribe( formValue => {
  if(this.formGroup.valid) {
    this.generatePerformanceGraph(formValue);
  }
});

1 Ответ

1 голос
/ 13 марта 2020

Попробуйте debounceTime, время зависит от вас ms. debounceTime игнорирует события, которые происходят в пределах 200ms друг от друга, и принимает только последнее.

https://www.learnrxjs.io/learn-rxjs/operators/filtering/debouncetime

this.formGroup.valueChanges.
pipe(
  debounceTime(200),
) .subscribe( formValue => {
  if(this.formGroup.valid) {
    this.generatePerformanceGraph(formValue);
  }
});

К go distinctUntilChanged, вы должны сделать это по-другому, потому что formValue - это объект.

this.formGroup.valueChanges.
pipe(
  distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)),
) .subscribe( formValue => {
  if(this.formGroup.valid) {
    this.generatePerformanceGraph(formValue);
  }
});
...