Esto es más como una pregunta que resolver un problema.
Me gustaría saber si hay algún escenario en el que tanto "Éxito" como "Error" no se activen.
La llamada posterior a "/logout" dará como resultado el código de retorno de estado Http 200 con el cuerpo de respuesta vacío que se espera
import { httpClient } from angular/common/http; private http: HttpClient; this.http.post<any>('/logout', {}) .subscribe( () => { console.log("Logout"); }, error => { console.log(error); }, () => { console.log("Finally"); });Emitirá "Finalmente" el 100% del tiempo. Eso significa que el éxito y el error no se activan en absoluto.
¿Hay posibilidades de que el éxito y el error no se activen? Y claramente la respuesta del código de estado http es 200 OK.
Actualización: la respuesta que proporcionó @meriton funciona muy bien.
Observable , en general, no están obligados a completar o error. Pueden permanecer vivos y seguir emitiendo valores para siempre.
Sin embargo, se garantiza que Observable devuelto por HttpClient finalizará con éxito o error (aunque el error puede demorar unos minutos en caso de que se agote el tiempo) según el estado HTTP de la respuesta. La presencia o ausencia de un cuerpo no afecta esto. Si la solicitud tiene éxito, el observable emitirá exactamente un valor: el cuerpo de la respuesta (o null si el cuerpo de la respuesta está ausente).
No puedo reproducir su afirmación de que "el éxito o el error no se activan en absoluto". ¿Puede haber entendido mal lo que significan las devoluciones de llamada? Cuando proporciona tres devoluciones de llamada para suscribirse, son, en orden:
next devolución de llamada, que recibe valores emitidoserror , que notifica que el Observable ha abortado debido a un errorcomplete , que notifica que el Observable se completó con éxitoEl peligro de mezclar las devoluciones de llamada es una de las razones por las que el equipo de RXJS ha desaprobado pasar varias devoluciones de llamada como argumentos separados para suscribirse en RXJS 8. La forma de prueba futura de escribir su código sería:
this.http.post<any>('/logout', {}).subscribe({ complete: () => { console.log("Logout successful") }, error: (error) => { console.log(error); } }); Por cierto, ninguna de estas devoluciones de llamada significa " finally ", como en la cláusula final de una declaración de try , que se ejecuta tanto en caso de éxito como de error. Si desea hacer algo independientemente de si el Observable se completó con éxito o falló con un error, puede usar el operador de finalize .
El éxito de la biblioteca http depende del Estado: 200, no requiere que el cuerpo del mensaje esté presente
Código de ejemplo de uso de flujo de tubería RXJS, donde puede controlar el flujo capturando el éxito y el error, controlando el tiempo de espera. También demuestra cómo puede usar el método .subscribe() como clásico Finalmente
Ejemplo de flujo RXJS:
this.http .post<any>('/logout',{}) .pipe( map(() => { // OK return { success: true, err: null }; }), timeout(10000), // CONTROL TIMEOUT catchError((e) => { // IN CASE OF ERROR return of({success: false, err:e}); }) ) .subscribe((result) => { // FINALLY here if (result.success) { console.log('Logged out successfully'); } else { console.log('Logout failed', result.err); } });