Dopo un po 'di test, leggere la documentazione e il codice sorgente di HttpClient.
HttpClient:
https://github.com/angular/angular/blob/master/packages/common/http/src/client.ts
HttpXhrBackend :
https://github.com/angular/angular/blob/master/packages/common/http/src/xhr.ts
HttpClientModule
: https://indepth.dev/exploring-the-httpclientmodule-in-angular/
Università angolare: https://blog.angular-university.io/angular-http/
Questo particolare tipo di osservabili sono flussi a valore singolo: se la richiesta HTTP ha esito positivo, questi osservabili emettono un solo valore e quindi completano
E la risposta all'intera questione di "HO BISOGNO" di annullare l'iscrizione?
Dipende.
Chiamate HTTP I fogli di memoria non rappresentano un problema. I problemi sono la logica delle funzioni di callback.
Ad esempio: Routing o Login.
Se la tua chiamata è una chiamata di accesso, non devi "annullare l'iscrizione" ma devi assicurarti che se l'utente lascia la pagina, gestisci correttamente la risposta in assenza dell'utente.
this.authorisationService
.authorize(data.username, data.password)
.subscribe((res: HttpResponse<object>) => {
this.handleLoginResponse(res);
},
(error: HttpErrorResponse) => {
this.messageService.error('Authentication failed');
},
() => {
this.messageService.info('Login has completed');
})
Da fastidioso a pericoloso
Ora immagina, la rete è più lenta del solito, la chiamata impiega più di 5 secondi e l'utente lascia la vista di accesso e passa a una "vista di supporto".
Il componente potrebbe non essere attivo ma l'abbonamento. In caso di risposta, l'utente verrà reindirizzato all'improvviso (a seconda dell'implementazione di handleResponse ()).
Questo non va bene.
Immagina anche che l'utente lasci il pc, credendo di non aver ancora effettuato l'accesso. Ma la tua logica accede l'utente, ora hai un problema di sicurezza.
Cosa puoi fare SENZA annullare l'iscrizione?
Ti fanno chiamare in base allo stato corrente della vista:
public isActive = false;
public ngOnInit(): void {
this.isActive = true;
}
public ngOnDestroy(): void {
this.isActive = false;
}
L'utente .pipe(takeWhile(value => this.isActive))
deve assicurarsi che la risposta sia gestita solo quando la vista è attiva.
this.authorisationService
.authorize(data.username, data.password).pipe(takeWhile(value => this.isActive))
.subscribe((res: HttpResponse<object>) => {
this.handleLoginResponse(res);
},
(error: HttpErrorResponse) => {
this.messageService.error('Authentication failed');
},
() => {
this.messageService.info('Login has completed');
})
Ma come puoi essere sicuro che l'abbonamento non stia causando i fogli di memoria?
Puoi registrare se viene applicato "teardownLogic".
Il log teardown di una sottoscrizione verrà chiamato quando la sottoscrizione è vuota o non iscritta.
this.authorisationService
.authorize(data.username, data.password).pipe(takeWhile(value => this.isActive))
.subscribe((res: HttpResponse<object>) => {
this.handleLoginResponse(res);
},
(error: HttpErrorResponse) => {
this.messageService.error('Authentication failed');
},
() => {
this.messageService.info('Login has completed');
}).add(() => {
// this is the teardown function
// will be called in the end
this.messageService.info('Teardown');
});
Non è necessario annullare l'iscrizione. Dovresti sapere se ci sono problemi nella tua logica, che potrebbero causare problemi nel tuo abbonamento. E prenditi cura di loro. Nella maggior parte dei casi, non sarà un problema, ma soprattutto in compiti critici come l'autorizzazione, dovresti prenderti cura di comportamenti imprevisti, collegandoli con "annulla iscrizione" o un'altra logica come il piping o le funzioni di callback condizionale.
perché non sempre annullare l'iscrizione?
Immagina di fare una richiesta put o post. Il server riceve il messaggio in entrambi i modi, solo la risposta richiede un po 'di tempo. Annullamento iscrizione, non annullerà il post o mettere. Ma quando annulli l'iscrizione, non avrai la possibilità di gestire la risposta o informare l'utente, ad esempio tramite una finestra di dialogo o un brindisi / messaggio, ecc.
Che induce l'utente a credere che la richiesta put / post non sia stata eseguita.
Quindi dipende. È la tua decisione di progettazione, come affrontare tali problemi.