RxJS Overwrite Timer / Observable Best Practice

Sep 10 2020

Estou tentando "zerar" um cronômetro quando um serviço emite um novo tempo de expiração. Eu tenho que sobrescrever o observável. Não tenho certeza se devo "coletar o lixo" o observável OU se há uma maneira melhor de "zerar" o cronômetro.

Este código funciona bem, mas não tenho certeza se essas são as práticas recomendadas

    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);
      });
    }

Respostas

2 bryan60 Sep 10 2020 at 00:33

Não está muito claro o que você quer, mas parece que isso é tudo o que você quer fazer:

    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?

    }

assinaturas aninhadas dentro de assinaturas são uma prática ruim e levam a um código confuso. use operadores para combinar fluxos conforme necessário.