RxJS Overwrite Timer / Observable Best Practice

Sep 10 2020

Ich versuche, einen Timer zurückzusetzen, wenn ein Dienst eine neue Ablaufzeit ausgibt. Ich habe es das Beobachtbare überschreiben. Ich bin nicht sicher, ob ich das beobachtbare "Müll sammeln" soll ODER ob es einen besseren Weg gibt, den Timer "zurückzusetzen".

Dieser Code funktioniert gut, aber ich bin mir nicht sicher, ob dies Best Practices sind

    const openModal = () => {
      if (this.sessionModal === null) {
        this.sessionModal = this.modalService.open(SessionModalComponent, {size: 'sm', backdrop: 'static', keyboard: false});
        this.sessionModal.result.then(() => this.sessionModal = null);
      }
    };

    this.expiresAt = authService.expiresAt;

    if (this.expiresAt !== null) {

      this.sessionTimerSubscription
        = timer(this.expiresAt.getTime() - (new Date()).getTime() - this.sessionModalOffset).subscribe(openModal);

      authService.expiresAt$.subscribe((expiresAt) => {

        this.expiresAt = expiresAt;

        this.sessionTimerSubscription.unsubscribe();
        this.sessionTimerSubscription
          = timer(this.expiresAt.getTime() - (new Date()).getTime() - this.sessionModalOffset).subscribe(openModal);
      });
    }

Antworten

2 bryan60 Sep 10 2020 at 00:33

Nicht ganz klar, was Sie wollen, aber es scheint, dass dies alles ist, was Sie tun möchten:

    this.expiresAt = authService.expiresAt;

    if (this.expiresAt !== null) {

      // when the signal emits
      authService.expiresAt$.pipe(
        startWith(this.expiresAt), // starting with the current value
        tap(expiresAt => this.expiresAt = expiresAt), // set the state (if you must?)
        switchMap(expiresAt =>  // switch into a new timer
          timer(expiresAt.getTime() - (new Date()).getTime() - this.sessionModalOffset)
        )
      ).subscribe(openModal); // subscribe the modal?

    }

In Abonnements verschachtelte Abonnements sind eine schlechte Praxis und führen zu unordentlichem Code. Verwenden Sie Operatoren, um Streams nach Bedarf zu kombinieren.