typescript - I Angular, är detta ett giltigt sätt att kontrollera om en observable-prenumeration är öppen innan man försöker stänga den?
I Angular, är detta ett giltigt sätt att kontrollera om ett observerbart prenumeration är öppet innan man försöker stänga det? Det verkar ge korrekt beteende. Det vill säga, det stänger bara prenumerationer som är öppna. Vad jag undrar är om det finns ett mer "korrekt" sätt att göra det på i Angular.
import { Component, OnUpdate, OnDestroy } from '@angular/core';
import { AngularFirestore } from 'angularfire2/firestore';
import { VoteService } from '../../services/vote.service';
export class Foo implements OnUpdate, OnDestroy {
private voteSubscription;
constructor(private afs: AngularFirestore,public voteService: VoteService) {}
ngOnUpdate() {
/* Lots of complicated things happen here which result in voteSubscription
being opened and closed based on external conditions including but not
limited to auth state. Bottom line is that sometimes the subscription
is active and sometimes it's not. */
if ( CONSTANTLY_CHANGING_INPUT_CONDITIONS ) {
this.voteSubscription = this.voteService.getUserVotes().subscribe();
} else {
if (this.voteSubscription) {
this.voteSubscription.unsubscribe();
}
}
}
ngOnDestroy() {
/* Avoid producing a console error if we try to close a subscription that is
already closed. */
if (this.voteSubscription) {
this.voteSubscription.unsubscribe();
}
}
}
Svar #1
Objektet Subscription har också en closed-egenskap som man kan använda för att kontrollera om strömmen redan har avregistrerats (slutförd eller hade ett fel).
Så om du vill kan du också använda det i if-satsen:
if (this.voteSubscription && !this.voteSubscription.closed)
Men detta är inte nödvändigt, RxJs gör detta internt åt oss. Inuti unsubscribe-metoden hittar du något som liknar:
if (this.closed) {
return;
}
Så man kan tryggt kalla på unsubscribe utan att behöva oroa sig för att strömmen kanske redan har stängts.
