Este error comenzó a aparecer después de migrar a TS 2.2.2, así que asumo que ese es el problema... El código no dejó de funcionar, pero ahora recibo ese error e intenté algunas cosas como devolver un observable vacío , capturando la excepción lanzada de nuevo y devolviendo un objeto, nada parecía funcionar. ¿Por qué sucede esto ahora? ¿No debería entender que estoy volviendo a lanzar la excepción y no esperar un retorno? ¿Estoy leyendo mal el error?
Esta es la descripción completa del error:
Aquí está el código completo:
return request .map((res: Response) => res.json()) .catch((error: any) => { // todo: log? if (error.status == 500) { this.alertService.showError(error.statusText); } else if (error.status == 588) { this.alertService.showAlert(error.statusText); } Observable.throw(error.statusText); }); Intenté devolver el Observable, pero mi método contenedor espera un retorno de tipo T , que es el retorno de mi solicitud deserializado ( map(...) ). Si devuelvo el throw , este es el error que obtengo:
[ts] El tipo 'Observable' no es asignable al tipo 'T'
Estoy usando:
- Angular4
- Texto mecanografiado 2.2.2
tienes que devolver el Observable
return request .map((res: Response) => res.json()) .catch((error: any) => { // todo: log? if (error.status == 500) { this.alertService.showError(error.statusText); } else if (error.status == 588) { this.alertService.showAlert(error.statusText); } return Observable.throw(error.statusText); });A veces, cuando llamas a catch sin usar la función de flecha como se muestra a continuación
getUserList() { return this.http.get(this.constURL + '/api/url/here', this.headerOptions) .catch(this.handleError); } handleError(error: Response) { if (error.status == 500) { this.router.navigate(['/login']); } else { return Observable.throw(error); } }entonces da error de
ERROR TypeError: no se puede leer la propiedad 'navegar' de indefinido sin obtener esto
Debido a que en la función handleError, este objeto no es accesible ... si consola este enrutador, obtendrá indefinido ... por lo que este objeto no funciona y no obtiene enrutador todos los métodos disponibles
Así que tienes que usar la función de flecha aquí como a continuación
getUserList() { return this.http.get(this.constURL + '/api/url/here', this.headerOptions) .catch(error => { return this.handleError(error); }); } handleError(error: Response) { if (error.status == 500) { this.router.navigate(['/login']); } else { return Observable.throw(error); } }Además, si no ha mencionado el retorno de la función handlerError, volverá a generar un error como
El argumento de tipo '(error: any) => void' no se puede asignar al parámetro de tipo
Entonces es necesario escribir return para la función handlerError.
Verifique aquí en detalle. Ha explicado muy bien el código con todos los errores posibles y la solución de eso ... funcionó para mí
Esta es una respuesta para angular 6 con RXJS 6. En su función de solicitud, se vería similar a esto. Tenga en cuenta que catch se reemplazó con catchError y Observable.throw ahora es throwError . También en RXJS 6 usamos tubería para unir una secuencia de función que deseamos realizar en lugar del encadenamiento de puntos anterior.
//In your service getData(url: string): Observable<any> { let options = this.getHTTPOptions(); return this.http.get<any>(url, options).pipe( catchError( (err: any, caught: Observable<any>) => { return throwError(this.generalErrorHandler(err, caught)) } ) ); } Entonces puedes tener un controlador de errores. La clave es especificar la palabra clave return en la función catchError anterior y devolver el error en el controlador. La flecha ( => ) le permite pasar el contexto de la función de llamada al controlador de errores, lo que significa que puede hacer cosas geniales como this.router.navigate(['someroute']); (Si tiene el enrutador importado en su servicio)
//In your service generalErrorHandler(error: any, caught: Observable<any>): Observable<any> { console.log('error caught: ', error); if( error.error.status == "INVALID_TOKEN" || error.error.status == "MAX_TOKEN_ISSUE_REACHED"){ console.log('token has expired'); this.logout(); return error; } return error; }Algunas importaciones clave para que esto funcione:
//Imports for the service import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http'; import { Http, Response } from '@angular/http'; import { catchError, map } from 'rxjs/operators'; import { Observable, throwError, of} from 'rxjs';Y por último para suscribirte a la solicitud de obtener tus datos:
//In your component, don't forget to import your service let response$ = this.someService.getData('url here'); response$.subscribe( data => { console.log('do stuff to data here', data); }, err => { console.log("couldn't get data, maybe show error to user"); }, () => { console.log('function that is called upon finish'); } );