тайм-аут внутри подписки rxjs - PullRequest
1 голос
/ 14 февраля 2020

У меня есть следующий код

this.someFormGroup.controls['control1'].valueChanges.subscribe(val => {
   if (val) {
      doStuff();
   }
   setTimeout(() => doOtherStuff(), 1000);
});

Мне интересно, есть ли другой способ добиться этого без использования setTimeout, я думал о timer из rx js, но я не уверен, как это может быть включено сюда.

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Хотя вышеприведенное решение работает, побочные эффекты трубы никогда не являются решением, для которого вы хотите go. Одним из больших преимуществ Rx является то, что вы всегда знаете , что происходит , , когда и , как . Существует множество статей о том, почему не следует использовать побочные эффекты в целом:

Также помните: всегда, действительно всегда возможно реализовать решения без отвода и большинство Времена это довольно легко, как вы можете видеть вниз.

private readonly valueChanges$: Observable<any> = this.someFormGroup.controls['control1'].valueChanges

private readonly delayedValuechanges$: Observable<any> = this.valueChanges$.pipe(
  delay(1000)
)

constructor(private readonly someFormGroup: SomeFormGroup) {
  this.valueChanges$.subscribe(this.doStuff);
  this.delayedValueChanges$.subscribe(this.doOtherStuff);
}
0 голосов
/ 14 февраля 2020

Вы можете использовать tap и delay:

this.someFormGroup.controls['control1'].valueChanges
  .pipe(
    tap(val => {
      if (val) {
        doStuff();
      }
    }),
    delay(1000),
  )
  .subscribe(() => doOtherStuff());
...