typescript - Må jeg avslutte abonnement på en Angular Observable?
Det er overraskende vanskelig å få et klart svar på om og når du bør melde deg av et Angular Observable.
Jeg har følgende scenario:
this.subscription = this.service.makeHTTPCall(stuff).subscribe(x => {
//do something
});
Det er noen løsninger jeg ser:
Ikke lagre abonnementet som en variabel, betyr dette at jeg ikke trenger å avslutte abonnementet?
this.service.makeHTTPCall(stuff).subscribe(x => { //do something });Lagre abonnementet som en variabel og avslutt abonnementet i ngOnDestroy
ngOnDestroy() { if (this.subscription) { this.subscription.unsubscribe(); } }Ikke gjør noe, Angular ordner all avmeldingsstuffen for deg
Jeg vet at det finnes tredjepartsbiblioteker som ng-take-until-destroy, men hvis vi antar at vi ikke har noen tredjepartsbiblioteker, hvilken metode anbefales da for å melde seg av?
Svar #1
Du trenger ikke å avmelde deg manuelt fra HTTP Observable og Router observable. For alle andre abonnenter er beste praksis å opprette et subject onDestroy$og deretter ta alle abonnentene til onDestroy$er aktiv ved å bruke rxjs pipe takeUntil(). I ngOnDestroy sender du så true i onDestroy$-subjecten og avmelder deg fra den. Alle de andre abonnentene vil stoppe samtidig. Angular sorterer ikke ut alt av avmeldinger for deg, du bør gjøre det selv. Det kan føre til mange vanskelige å feilsøke feil å la gjenglemte abonnenter være igjen etter at komponenten er ødelagt. Nedenfor er eksempel på kode:
onDestroy$: Subject<boolean> = new Subject();
ngOnInit() {
this.service.someSubscriber.pipe(takeUntil(this.onDestroy$)).subscribe(() =>
{ //do stuff
})
this.service.someSubscriber2.pipe(takeUntil(this.onDestroy$)).subscribe(() =>
{ //do stuff
})
this.service.someSubscriber3.pipe(takeUntil(this.onDestroy$)).subscribe(() =>
{ //do stuff
})
}
ngOnDestroy() {
this.onDestroy$.next(true);
this.onDestroy$.unsubscribe();
}
I HTML-mal utløser async-pipen automatisk avmelding, så når du bruker den trenger du ikke å bekymre deg for det.
Svar #2
Du trenger ikke å avslutte abonnementet manuelt på HTTP Observable og Router observable. Bortsett fra disse to, må du manuelt avslutte abonnementet på enhver subject eller observable du oppretter ved å bruke en måte du allerede har nevnt, en annen måte kan være å bruke async-operatoren. Async-operatoren avslutter automatisk abonnementet for deg, en annen måte er å bruke takeUntil-operatoren.
Fra https://stackoverflow.com/a/41177163/2987066
Kort fortalt :
For dette spørsmålet finnes det (2) typer observabler - endelig verdi og uendelig verdi.
http Observables produserer endelige (1) verdier, og noe som en DOM-hendelseslytter Observables produserer uendelige verdier.
Hvis du manuelt kaller subscribe (ikke bruker async pipe), må du deretter unsubscribe fra uendelige Observables.
Ikke bekymre deg for endelige, RxJs vil ta seg av dem.
