Después de un tiempo de prueba, leer la documentación y el código fuente del 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/
Universidad Angular: https://blog.angular-university.io/angular-http/
Este tipo particular de Observables son flujos de un solo valor: si la solicitud HTTP es exitosa, estos observables emitirán solo un valor y luego se completarán
¿Y la respuesta a toda la cuestión de "NECESITO" darme de baja?
Depende.
Las llamadas de memoria HTTP no son un problema. Los problemas son la lógica en sus funciones de devolución de llamada.
Por ejemplo: enrutamiento o inicio de sesión.
Si su llamada es una llamada de inicio de sesión, no tiene que "darse de baja", pero debe asegurarse de que si el Usuario abandona la página, maneje la respuesta correctamente en ausencia del usuario.
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');
})
De molesto a peligroso
Ahora imagine que la red es más lenta de lo habitual, la llamada tarda más de 5 segundos y el usuario abandona la vista de inicio de sesión y se dirige a una "vista de soporte".
El componente puede no estar activo pero la suscripción. En caso de una respuesta, el usuario se redirigirá repentinamente (dependiendo de la implementación de handleResponse ()).
Esto no es bueno
También imagine que el usuario deja la PC, creyendo que aún no ha iniciado sesión. Pero su lógica inicia sesión en el usuario, ahora tiene un problema de seguridad.
¿Qué puedes hacer SIN darte de baja?
Haga que su llamada dependa del estado actual de la vista:
public isActive = false;
public ngOnInit(): void {
this.isActive = true;
}
public ngOnDestroy(): void {
this.isActive = false;
}
Usuario .pipe(takeWhile(value => this.isActive))
para asegurarse de que la respuesta solo se maneja cuando la vista está activa.
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');
})
Pero, ¿cómo puede estar seguro de que la suscripción no está causando pérdidas de memoria?
Puede iniciar sesión si se aplica "teardownLogic".
Se llamará al teardownLogic de una suscripción cuando la suscripción esté vacía o cancelada.
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');
});
No tiene que darse de baja. Debe saber si hay problemas en su lógica, que podrían causar problemas en su suscripción. Y cuídalos. En la mayoría de los casos, no será un problema, pero especialmente en tareas críticas como la autorización, debe tener cuidado con el comportamiento inesperado, ya sea con "darse de baja" u otra lógica como la canalización o las funciones de devolución de llamada condicional.
¿Por qué no siempre darse de baja?
Imagina que haces una solicitud de venta o publicación. El servidor recibe el mensaje de cualquier manera, solo la respuesta lleva un tiempo. Darse de baja, no deshacerá la publicación ni la pondrá. Pero cuando se da de baja, no tendrá la oportunidad de manejar la respuesta o informar al Usuario, por ejemplo, a través de Diálogo o un Brindis / Mensaje, etc.
Lo que hace que el usuario crea que la solicitud de poner / publicar no se realizó.
Entonces eso depende. Es su decisión de diseño, cómo lidiar con tales problemas.