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.