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 => { ... });

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


person Rob Fleischmann    schedule 28.12.2017    source источник


Ответы (1)


Заменять

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

с

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

куда

private reset$ = new Subject<void>();

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

public resetTimer() {
  this.reset$.next();
}
person Ingo Bürk    schedule 28.12.2017
comment
Ты великолепен! Это было так ясно для понимания, и это работает отлично! Благодарю вас! - person Rob Fleischmann; 28.12.2017