RXJS - SwitchMap или SwitchMapTo для сброса таймера

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

Я читал на switchMap и switchMapTo, но примеры, которые я нашел, используют какое-то событие щелчка или событие перемещения мыши. Моя ситуация в том, что я не хочу обновлять данные по нажатию кнопки, так как я проверяю JWT. После успешной проверки JWT я обновлю таймер.

У меня есть общая библиотека для пользователей, которая настраивает таймер следующим образом:

private tick: Subscription;
public tokenExpirationTime: Subject<number>;

  setupExpirationTimer():void {
    // Start the timer based on the expiration
    var expirationSeconds = this.expiration * 60;
    this.tick = Observable.timer(0, 1000).map(i => expirationSeconds - i).subscribe(x => {
      // Set the seconds in the user object
      this.tokenExpirationTime.next(x);
      console.log("TIMER: " + x);
    });
  }

В другом месте в моем коде я подписываюсь на tokenExpirationTime (именно так я узнаю, какое текущее время находится на таймере, поэтому я знаю, когда показывать мое всплывающее окно).

Ex.

this.user.tokenExpirationTime.subscribe(x => { ... });

Я мог бы делать все это неправильно, так как я новичок в этом. Я надеюсь, что мое объяснение ясно, но дайте мне знать, если нет. Спасибо вам за помощь!

1 ответ

Решение

Замещать

Observable.timer(0, 1000)
  // … all the other stuff …

с

// Whenever reset$ emits…
reset$
  // (but we emit once initially to get the timer going)
  .startWith(undefined)
  // … start a new timer
  .switchMap(() => Observable.timer(0, 1000))
  // … all the other stuff …

где

private reset$ = new Subject();

Затем вы можете добавить функцию, как

public resetTimer() {
  this.reset$.next();
}
Другие вопросы по тегам