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.
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?