Как остановить 'observableTimer' - PullRequest
0 голосов
/ 14 мая 2018

Как бы вы остановили observableTimer, имея этот код:

observableTimer(0, 5000).pipe(
      tap(() => this.showLoader()),
      switchMap(() => this.store.dispatch(new Load()))
    )
    .subscribe((data: any) => {
      this.stopLoader();
    });

Мне нужно запустить таймер до некоторого условия, скажем, у меня есть переменная или наблюдаемая в коде, поэтому, когда это false Я хочу остановить таймер.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я просто достигаю цели с помощью этого кода:

data: Subscription;

this.data = observableTimer(0, 5000).pipe(
      tap(() => this.showLoader()),
      switchMap(() => this.store.dispatch(new Load()))
    ).subscribe((data: any) => {
      this.stopLoader();
    });

Тогда я могу ubusbscribe по своему условию

this.reconciliation.unsubscribe();

Но не уверен, что это лучший подход.Мысли?

0 голосов
/ 14 мая 2018

скажем, у меня есть переменная

Вы можете использовать takeWhile

скажи, что у меня есть [...] наблюдаемые

Вы можете использовать takeUntil


Вот пример:

data$.pipe(
  takeUntil(this.stopTimer$),
  //... 
)

Когда выходит stopTimer$, любая подписка на эту наблюдаемую будет остановлена, потому что наблюдаемая завершается.


тогда я не смогу отписаться по своему условию:

Проблема здесь в том, что вы пытаетесь отписаться от наблюдаемого, что не имеет смысла. Вы можете только отменить подписку. Так что вы могли бы сделать

this.sub = data$.pipe(...).subscribe(...);
this.sub unsubscribe();

Но я лично предпочел бы метод takeUntil, описанный выше, так как отписка будет запечатлена непосредственно в самом наблюдаемом после его завершения.

...